框架
版本

并行查询

“并行” 查询是指同时执行的查询,以最大化获取并发性。

手动并行查询

当并行查询的数量不变时,使用并行查询无需额外 effort。只需并排使用任意数量的 TanStack Query 的 useQueryuseInfiniteQuery 钩子即可!

tsx
function App () {
  // The following queries will execute in parallel
  const usersQuery = useQuery({ queryKey: ['users'], queryFn: fetchUsers })
  const teamsQuery = useQuery({ queryKey: ['teams'], queryFn: fetchTeams })
  const projectsQuery = useQuery({ queryKey: ['projects'], queryFn: fetchProjects })
  ...
}
function App () {
  // The following queries will execute in parallel
  const usersQuery = useQuery({ queryKey: ['users'], queryFn: fetchUsers })
  const teamsQuery = useQuery({ queryKey: ['teams'], queryFn: fetchTeams })
  const projectsQuery = useQuery({ queryKey: ['projects'], queryFn: fetchProjects })
  ...
}

当在 suspense 模式下使用 React Query 时,这种并行模式不起作用,因为第一个查询会在内部抛出一个 promise,并在其他查询运行之前暂停组件。为了解决这个问题,你要么需要使用 useSuspenseQueries 钩子(建议使用),要么为每个 useSuspenseQuery 实例使用单独的组件来编排你自己的并行性。

使用 useQueries 的动态并行查询

如果需要执行的查询数量在渲染之间发生变化,则不能使用手动查询,因为这会违反钩子的规则。相反,TanStack Query 提供了一个 useQueries 钩子,你可以使用它来动态并行执行任意数量的查询。

useQueries 接受一个选项对象,其中包含一个 queries 键,其值是查询对象数组。它返回一个查询结果数组

tsx
function App({ users }) {
  const userQueries = useQueries({
    queries: users.map((user) => {
      return {
        queryKey: ['user', user.id],
        queryFn: () => fetchUserById(user.id),
      }
    }),
  })
}
function App({ users }) {
  const userQueries = useQueries({
    queries: users.map((user) => {
      return {
        queryKey: ['user', user.id],
        queryFn: () => fetchUserById(user.id),
      }
    }),
  })
}