框架
版本

useQueries

useQueries 钩子可用于获取可变数量的查询:

tsx
const ids = [1, 2, 3]
const results = useQueries({
  queries: ids.map((id) => ({
    queryKey: ['post', id],
    queryFn: () => fetchPost(id),
    staleTime: Infinity,
  })),
})
const ids = [1, 2, 3]
const results = useQueries({
  queries: ids.map((id) => ({
    queryKey: ['post', id],
    queryFn: () => fetchPost(id),
    staleTime: Infinity,
  })),
})

选项

useQueries 钩子接受一个选项对象,该对象具有一个 queries 键,其值为一个查询选项对象数组,该数组与 useQuery 钩子的选项对象相同(不包括 queryClient 选项——因为 QueryClient 可以在顶层传入)。

  • queryClient?: QueryClient
    • 使用此选项可提供自定义 QueryClient。否则,将使用最近上下文中的 QueryClient。
  • combine?: (result: UseQueriesResults) => TCombinedResult
    • 使用此选项可将查询结果合并为一个值。

在查询对象数组中多次使用相同的查询键可能会导致某些数据在查询之间共享。为避免这种情况,请考虑对查询进行重复数据删除并将结果映射回所需的结构。

占位符数据

placeholderData 选项也适用于 useQueries,但它不会像 useQuery 那样从先前渲染的查询中传递信息,因为 useQueries 的输入在每次渲染时可以是不同数量的查询。

返回值

useQueries 钩子返回一个包含所有查询结果的数组。返回的顺序与输入顺序相同。

合并

如果您想将结果中的 data(或其他查询信息)合并为一个值,可以使用 combine 选项。结果将进行结构共享,以尽可能保持引用稳定。

tsx
const ids = [1, 2, 3]
const combinedQueries = useQueries({
  queries: ids.map((id) => ({
    queryKey: ['post', id],
    queryFn: () => fetchPost(id),
  })),
  combine: (results) => {
    return {
      data: results.map((result) => result.data),
      pending: results.some((result) => result.isPending),
    }
  },
})
const ids = [1, 2, 3]
const combinedQueries = useQueries({
  queries: ids.map((id) => ({
    queryKey: ['post', id],
    queryFn: () => fetchPost(id),
  })),
  combine: (results) => {
    return {
      data: results.map((result) => result.data),
      pending: results.some((result) => result.isPending),
    }
  },
})

在上面的示例中,combinedQueries 将是一个包含 datapending 属性的对象。请注意,查询结果的所有其他属性都将丢失。

记忆化

combine 函数仅在以下情况下才会重新运行:

  • combine 函数本身在引用上发生了更改
  • 任何查询结果发生了更改

这意味着如上所示的内联 combine 函数将在每次渲染时运行。为避免这种情况,您可以将 combine 函数包装在 useCallback 中,或者如果它没有任何依赖项,则将其提取到一个稳定的函数引用中。