【问题标题】:Filtering table result based on user input in react根据反应中的用户输入过滤表结果
【发布时间】:2021-11-26 01:26:09
【问题描述】:

目前的功能是 只有当用户点击submit 按钮时才会加载数据。如果他没有放任何filter,那么所有数据都会被加载。

 const submit = async (e: SyntheticEvent) => {
        e.preventDefault();
        const param = {
            ...(certificateNo && { certificateNo: certificateNo }),
            ...(protoColNo && { protoColNo: protoColNo }),
            ...(requestStatus && { requestStatus: requestStatus }),
            ...(sponser && { sponser: sponser }),
            ...(country && { country: country }),
            ...(noOfSubjects && { noOfSubjects: noOfSubjects }),
            ...(startDate && { startDate: startDate }),
            ...(endDate && { endDate: endDate }),
        };
        console.log(param);
        const { data } = await axios.get('http://localhost:3000/api/certificates', {
            params: param,
        });
        console.log(data);
        setFlag(true);
        setResponse(data);
    };

现在我有一个要求。当page 获取没有任何filter 的加载数据时,应该在页面上加载。表示用户访问时可以看到页面上的数据,稍后他可以在点击提交按钮后应用过滤器。

我正在考虑使用 useEffect() ,你能指导一下如何做到这一点。

我在这里放了下一个和上一个代码

 const [page, setPage] = useState(1);
 const [lastPage, setLastPage] = useState(0);




const next = () => {
        if (page <= lastPage) {
          setPage(page + 1);
          fetchData(page);
        }
      }

和以前的

const prev = () => {

        if (page >= 1) {
          setPage(page - 1);
        }
      }

下面是我创建的按钮

  <ul className="pagination">
          <li className="page-item">
            <button onClick={prev}>Previous</button>
          </li>
          <li className="page-item">
            <button onClick={next}>Next</button>
          </li>
        </ul>

【问题讨论】:

  • 点击提交后,您是发送 API 请求,返回过滤后的数据,还是只想过滤状态中存储的数据?
  • 您需要一个新状态const [ filter, setFitler ] = useState({});,它会在您更新表单时存储表单的详细信息。当您提交表单时,您将调用一个函数,该函数将在数据上 filter 并返回一组新数据,其中数据中的属性值与过滤器对象中的值匹配。然后该数据将用于您的表格。
  • @Gnanavel 在页面加载时将在 UI 上加载整个数据。用户可以稍后过滤。所以基本上需要过滤存储在状态上的数据。
  • @Andy 每次用户单击提交按钮时我都必须调用 API 吗?我们可以做点什么,以便在 UI 级别进行处理吗?
  • @NiharikaS 不一定。您必须下载 所有 数据,根据其大小,这些数据可能不如将过滤器状态发送到使用该信息发回正确数据的服务器那样最佳。您的数据集中有多少行数据?

标签: javascript html reactjs api react-hooks


【解决方案1】:

既然你有你的后端过滤机制。只需创建一个包含所有过滤器数据的状态。创建一个函数fetchData 来完成获取工作。当用户第一次访问fetchData 内的useEffect 时,将被调用,此时所有过滤器都将为空,因此应加载所有数据。应用过滤器后,如果用户提交了submit 中的按钮 fetchData 函数,将调用事件。并为分页机制保持另一种状态。如果要获取下一页的记录,只需增加page 状态

const [filters,setFilters]=useState({
    certificateNo:"",
    protoColNo:"",
    requestStatus:"",
    sponser:"",
    country:"",
    noOfSubjects:"",
    startDate:"",
    endDate:"",
})
const [page,setPage] = useState(1)
const fetchData = async (page)=>{
    const {
        certificateNo,
        protoColNo,
        requestStatus,
        sponser,
        country,
        noOfSubjects,
        startDate,
        endDate,
    } = filters

    const param = {
        ...(certificateNo && { certificateNo: certificateNo }),
        ...(protoColNo && { protoColNo: protoColNo }),
        ...(requestStatus && { requestStatus: requestStatus }),
        ...(sponser && { sponser: sponser }),
        ...(country && { country: country }),
        ...(noOfSubjects && { noOfSubjects: noOfSubjects }),
        ...(startDate && { startDate: startDate }),
        ...(endDate && { endDate: endDate }),
    };
    console.log(param);
    const { data } = await axios.get(`http://localhost:3000/api/certificates?page=${page}`, {
        params: param,
    });
    setFlag(true);
    setResponse(data);
}
const submit = async (e: SyntheticEvent) => {
    e.preventDefault();
    fetchData(page)
};

useEffect(()=>{
    fetchData(page)
},[page])

【讨论】:

  • 我已经把代码放在上面了。能否请您指导,修改以上。
  • 谢谢 Ganesh...实际上要求即使没有用户点击提交,所有数据都应该在那里。表示在登陆时用户可以看到数据。稍后他可以应用过滤器并提交按钮,然后他将只看到该数据..
  • 这么多记录听起来你应该实现无限滚动。 ag-grid 对此有很好的实现。
  • @NiharikaS 我已经更新了我的答案,请检查
  • @NiharikaS 你不需要在fetchData() 中使用setPage()。因为useEffect will 在组件第一次渲染和page 状态值更改时运行。如果您单击第 2 页(在分页中),您将调用下一个函数,该函数将增加 page 状态值,这将导致组件重新渲染并在我们执行的 useEffect 中获取数据。所以你也不需要在nextprev函数中使用fetchData()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-30
  • 2016-09-05
  • 2021-01-18
  • 2018-11-05
相关资源
最近更新 更多