useInfiniteQuery
是 React Query 库中的一个钩子(hook),它使得处理无限滚动或者分页场景变得轻松。当面对多个查询时,我们通常有几种策略来组织和管理这些查询。
1. 分离查询
首先,如果每个查询都是独立的,我们可以简单地为每个查询使用一个单独的 useInfiniteQuery
。例如,如果我们有两个不同数据源的列表需要无限加载,我们可以分别为每个列表创建一个 useInfiniteQuery
钩子。
javascriptfunction App() { const { data: list1, fetchNextPage: fetchNextList1 } = useInfiniteQuery('list1', fetchList1); const { data: list2, fetchNextPage: fetchNextList2 } = useInfiniteQuery('list2', fetchList2); return ( <div> <List1 data={list1} onLoadMore={fetchNextList1} /> <List2 data={list2} onLoadMore={fetchNextList2} /> </div> ); }
2. 合并查询
如果这些查询某种程度上是相关联的,我们可能需要合并它们的数据来展示。这种情况下,我们可以单独查询每个数据源,然后使用一个状态管理库(如Redux或Context API)或者简单的 React 状态将它们组合在一起。
javascriptfunction useCombinedInfiniteQueries(queryKeys) { const queries = queryKeys.map(key => useInfiniteQuery(key, fetchDataForKey(key)) ); // 合并数据 const combinedData = React.useMemo(() => { return queries.map(q => q.data ? q.data.pages.flat() : []).flat(); }, [queries]); // 处理加载更多的逻辑 const fetchNextPages = () => { queries.forEach(query => { if (query.hasNextPage) { query.fetchNextPage(); } }); }; return { combinedData, fetchNextPages }; } function App() { const { combinedData, fetchNextPages } = useCombinedInfiniteQueries(['list1', 'list2']); return ( <CombinedList data={combinedData} onLoadMore={fetchNextPages} /> ); }
3. 依赖查询
如果第二个查询依赖于第一个查询的结果,我们可以在第一个查询的 data
或 status
更改时触发第二个查询。
javascriptfunction DependentQueries() { const firstQuery = useInfiniteQuery('first', fetchFirstList); const secondQuery = useInfiniteQuery('second', fetchSecondList, { // 只有当第一个查询存在数据时才启用第二个查询 enabled: !!firstQuery.data }); return ( <div> <FirstList data={firstQuery.data} /> {firstQuery.data && <SecondList data={secondQuery.data} />} </div> ); }
以上都是处理多个无限加载查询的常见模式。根据具体需求和数据间的关系,选择最适合的方式将有助于保持代码的可管理性和性能。
2024年6月29日 12:07 回复