乐闻世界logo
搜索文章和话题

How to I pass a filters variable to useInfiniteQuery with pageParam?

1 个月前提问
1 个月前修改
浏览次数5

1个答案

1

在React Query中,使用InfiniteQuery来实现无限滚动功能时,可能会遇到需要根据某些过滤条件(如用户输入或选择的标签)动态改变请求数据的情况。为了结合过滤器变量和pageParam,你可以按照以下步骤进行操作:

1. 定义初始过滤条件和查询函数

首先,你需要定义初始的过滤条件,并创建一个查询函数来根据这些条件和页码来获取数据。例如:

javascript
import { useInfiniteQuery } from 'react-query'; function usePosts(filter) { return useInfiniteQuery( ['posts', filter], // 使用数组来包含过滤条件和查询的key,确保过滤条件变化时可以重新获取数据 ({ pageParam = 1 }) => fetchPosts(pageParam, filter), { getNextPageParam: (lastPage, pages) => lastPage.nextPage, } ); } async function fetchPosts(page, filter) { const response = await fetch(`/api/posts?page=${page}&filter=${filter}`); return response.json(); }

2. 在组件中使用过滤器

接着,在你的组件中,根据用户的交互动态设置过滤条件,并将这些条件传递给上面定义的usePosts钩子。

javascript
function PostsComponent() { const [filter, setFilter] = useState(''); const handleFilterChange = (event) => { setFilter(event.target.value); }; const { data, error, fetchNextPage, hasNextPage, isFetchingNextPage, status, } = usePosts(filter); return ( <> <input type="text" value={filter} onChange={handleFilterChange} /> {data?.pages.map((page) => page.results.map((post) => <p key={post.id}>{post.title}</p>) )} <button onClick={() => fetchNextPage()} disabled={!hasNextPage || isFetchingNextPage}> Load More </button> </> ); }

3. 使用useEffect优化性能(可选)

如果你觉得数据更新太过频繁或者有性能问题,可以通过useEffect来延迟或限制请求的频率。

javascript
useEffect(() => { const handle = setTimeout(() => { refetch(); // 可以调用来重新触发查询 }, 500); // 延迟500毫秒后触发 return () => clearTimeout(handle); }, [filter, refetch]);

总结

这样,你就可以结合InfiniteQuery和动态的过滤条件来实现复杂的数据加载需求。在用户改变过滤条件时,react-query会自动重新发起请求以获取新的数据,并且保持页面状态和无限滚动的连贯性。

2024年8月5日 11:32 回复

你的答案