【问题标题】:Using query params with ReactTable使用带有 ReactTable 的查询参数
【发布时间】:2020-10-20 11:11:34
【问题描述】:

我有一个看起来或多或少像这样的反应表:

<ReactTable
          ref={tableRef}
          style={{ minHeight: "80vh" }}
          className="-highlight -striped  text-center"
          data={data}
          loading={isLoading}
          loadingText={getLoadingMessage("Fetching users...")}
          noDataText="No users found..."
          columns={getColumns()}
          filterable={false}
          minRows={0}
          pageSizeOptions={[10, 13, 20, 50, 100]}
          defaultPageSize={10}
          onFetchData={tableState => getUsers({ tableState, searchValue })}
/>

我想使用查询参数,以便我可以在我的链接中,根据页面和行,像这样?page=3&rows=50。如何使用钩子来实现这一点?

这就是 getUsers 的样子:

getUsers: thunk(async (actions, { tableState, searchValue }) => {
    actions.setIsLoading(true);

    let QUERIES = getQueryParamsFromTable(tableState, searchValue);

    try {
      const { data } = await api.get(urlParamReplacer(AUTH.USERS), {
        params: QUERIES
      });
      actions.setUsers(data);
    } catch (error) {
      actions.setIsLoading(false);
      console.error(error);
    }
  }),

这是setIsLoading:

setIsLoading: action((state, payload) => {
    state.isLoading = payload;
  }),

【问题讨论】:

    标签: reactjs url query-string react-table


    【解决方案1】:

    您可以创建自定义挂钩来返回查询参数或实现use-query-params 库。

    使用use-query-params库,可以用以下代码实现:

    const [query, setQuery] = useQueryParams({
      page: NumberParam,
      rows: NumberParam,
    });
    const [page, setPage] = useState(query.page || 0);
    
    <ReactTable
      ref={tableRef}
      style={{ minHeight: "80vh" }}
      className="-highlight -striped  text-center"
      data={data}
      loading={isLoading}
      loadingText={getLoadingMessage("Fetching users...")}
      noDataText="No users found..."
      columns={getColumns()}
      filterable={false}
      minRows={0}
      pageSizeOptions={[10, 13, 20, 50, 100]}
      defaultPageSize={10}
      page={page}
      pageSize={query.rows}
      onPageChange={pageIndex => setPage(pageIndex)}
      onFetchData={tableState => getUsers({ tableState, searchValue })}
    />
    

    这是一个带有自定义钩子的示例:

    import { useState, useEffect } from "react";
    import { useLocation, useHistory } from 'react-router-dom';
    
    const usePagination = (initialPage = 0, initialRows = 50) => {
      const location = useLocation();
      const searchParams = new URLSearchParams(location.search);
      const history = useHistory();
    
      const [page, updatePage] = useState(Number(searchParams.get("page")) || initialPage);
      const [rows, updateRows] = useState(Number(searchParams.get("rows")) || initialRows);
    
      useEffect(() => {
        const searchParams = new URLSearchParams(location.search);
        
        updatePage(Number(searchParams.get('page')) || page);
        updateRows(Number(searchParams.get('rows')) || rows);
      }, [location, page, rows]);
    
      const setPage = toPage => {
        searchParams.set("page", toPage || initialPage);
        history.push({ search: searchParams.toString() });
      };
    
      const setRows = toRows => {
        searchParams.set("rows", toRows || initialRows);
        history.push({ search: searchParams.toString() });
      };
    
      return {
        page,
        rows,
        setPage,
        setRows
      };
    };
    
    export default usePagination;
    
    const { page, rows, setPage, setRows } = usePagination();
    
    <ReactTable
      ref={tableRef}
      style={{ minHeight: "80vh" }}
      className="-highlight -striped  text-center"
      data={data}
      loading={isLoading}
      loadingText={getLoadingMessage("Fetching users...")}
      noDataText="No users found..."
      columns={getColumns()}
      filterable={false}
      minRows={0}
      pageSizeOptions={[10, 13, 20, 50, 100]}
      defaultPageSize={10}
      page={page}
      pageSize={rows}
      onPageChange={pageIndex => setPage(pageIndex)}
      onPageSizeChange={(pageSize, pageIndex) => {
        setPage(pageIndex);
        setRows(pageSize);
      }}
      onFetchData={tableState => getUsers({ tableState, searchValue })}
    />
    

    【讨论】:

    • 谢谢!这似乎几乎可以工作(我使用了第二个选项),但我有两个问题:每当我尝试搜索特定的 url 时,数据都会在后面加载,但页面看起来好像由于某种原因仍在加载(“正在获取用户...”显示为叠加)。你知道为什么会发生这种情况吗?另外我该如何实现后退功能?每当我按下返回但页面不会重新加载时,都会更新 url。
    • 第一个问题听起来像是您的getUsersisLoading 逻辑的问题。我必须查看更多您的代码才能帮助您。关于您的第二个问题,您使用的是 react-router 吗?如果是这样,我可以更新解决该问题的答案。
    • 我已经用第一个问题的两个代码块更新了我的答案。我不确定这是否是问题所在,我不知道您是否可以帮助我解决这个问题。我刚刚注意到,在覆盖层后面,页面计数器似乎以某种方式与页面查询参数连接。每当我有 ?page=3 例如,我得到 31。数据正确加载,但在加载时卡住了..可能是因为这个。是的,我正在使用 react-router。谢谢!
    • 不应该在请求成功存储数据的时候也设置actions.setIsLoading(false);吗?例如。在actions.setUsers(data); 之后
    • 试过了。似乎不起作用...我会尝试自己解决。但如果你能帮助我解决第二个问题,我将非常感激。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多