返回

ReactQuery (十四):无限查询 [译]

前端

技术在飞速发展,前端的工具也在不断进步, React Query 是一个非常流行的 JavaScript 库,它可以帮助您轻松地管理异步请求,并缓存响应结果,您已经体验过 Basic Queries 和 Paginated Queries,那么今天我们将介绍 Infinite Queries。

    ## 
    
    ### 无限查询简介
    
    无限查询是一种特殊的查询,它允许您将数据按需加载到列表或网格中。当用户滚动到底部时,它会自动加载更多数据。这是一种非常常见的 UI 模式,在新闻提要、社交媒体时间线和电子商务产品列表等应用中经常使用。
    
    ### 使用 useInfiniteQuery
    
    要使用无限查询,您需要使用 React Query 的 useInfiniteQuery 钩子。此钩子的工作方式与 useQuery 钩子非常相似,但它有几个重要的区别:
    
    * 它接受一个额外的参数,即 getNextPageParam 函数。此函数用于确定下一页数据的位置。
    * 它返回一个对象,其中包含以下属性:
        * data:查询结果数据。
        * error:如果查询失败,则为错误对象。
        * fetchMore:一个函数,用于加载更多数据。
        * isFetching:一个布尔值,指示查询是否正在加载。
        * isLoading:一个布尔值,指示查询是否正在加载初始数据。
        * isFetchingMore:一个布尔值,指示查询是否正在加载更多数据。
        * canFetchMore:一个布尔值,指示是否还有更多数据可加载。
    
    ### 示例
    
    以下是一个使用 useInfiniteQuery 钩子的示例:
    
    ```javascript
    import { useInfiniteQuery } from 'react-query';

    const Posts = () => {
      const { data, fetchMore, canFetchMore, isLoading, isError } = useInfiniteQuery('posts', async ({ pageParam = 1 }) => {
        const res = await fetch(`https://example.com/api/posts?page=${pageParam}`);
        return res.json();
      }, {
        getNextPageParam: (lastPage) => lastPage.nextPage,
      });

      if (isLoading) {
        return <div>Loading...</div>;
      }

      if (isError) {
        return <div>Error: {error.message}</div>;
      }

      return (
        <ul>
          {data.pages.map((page) => (
            <li key={page.id}>{page.title}</li>
          ))}
        </ul>
      );
    };

    export default Posts;
    ```
    
    在上面的示例中,我们使用 useInfiniteQuery 钩子来获取一组帖子数据。我们使用 getNextPageParam 函数来告诉 React Query 如何确定下一页数据的位置。在我们的例子中,下一页数据的位置存储在 lastPage.nextPage 属性中。
    
    ### 惰性查询
    
    无限查询还支持惰性查询。惰性查询是指只有在用户滚动到列表底部时才加载更多数据。这可以提高性能,因为您只加载用户实际需要的数据。
    
    要启用惰性查询,您需要将 useInfiniteQuery 钩子的 lazy 属性设置为 true。以下是一个使用惰性查询的示例:
    
    ```javascript
    import { useInfiniteQuery } from 'react-query';

    const Posts = () => {
      const { data, fetchMore, canFetchMore, isLoading, isError } = useInfiniteQuery('posts', async ({ pageParam = 1 }) => {
        const res = await fetch(`https://example.com/api/posts?page=${pageParam}`);
        return res.json();
      }, {
        getNextPageParam: (lastPage) => lastPage.nextPage,
        lazy: true,
      });

      if (isLoading) {
        return <div>Loading...</div>;
      }

      if (isError) {
        return <div>Error: {error.message}</div>;
      }

      return (
        <ul>
          {data.pages.map((page) => (
            <li key={page.id}>{page.title}</li>
          ))}
        </ul>
      );
    };

    export default Posts;
    ```
    
    在上面的示例中,我们通过将 lazy 属性设置为 true 来启用惰性查询。这告诉 React Query 只有在用户滚动到列表底部时才加载更多数据。
    
    ### 优点
    
    * 它使您能够轻松地将数据按需加载到列表或网格中。
    * 它可以提高性能,因为您只加载用户实际需要的数据。
    * 它支持惰性查询,这意味着只有在用户滚动到列表底部时才加载更多数据。
    
    ### 缺点
    
    * 它可能比其他类型的查询更复杂。
    * 它可能更难调试。