useQueries hook 可用于获取可变数量的查询。
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 hook 接受一个选项对象,该对象包含一个 queries 键,其值是一个查询选项对象的数组,这些对象与 useQuery hook 的选项对象相同(不包括 queryClient 选项 - 因为 QueryClient 可以在顶层传递)。
在查询对象数组中多次出现相同的查询键可能会导致某些数据在查询之间共享。为避免这种情况,请考虑对查询进行去重,并将结果映射回所需的结构。
placeholderData
useQueries 也有 placeholderData 选项,但它不像 useQuery 那样从先前渲染的 Queries 中传递信息,因为 useQueries 的输入在每次渲染时都可以是不同数量的 Queries。
Returns (返回)
useQueries hook 返回一个包含所有查询结果的数组。返回的顺序与输入顺序相同。
如果你想将结果中的 data(或其他 Query 信息)合并成一个单一值,可以使用 combine 选项。结果在结构上会共享,以保持尽可能高的引用稳定性。
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 将是一个包含 data 和 pending 属性的对象。请注意,Query 结果的所有其他属性都将丢失。
combine 函数仅在以下情况重新运行时:
这意味着,像上面那样内联的 combine 函数会在每次渲染时运行。为了避免这种情况,你可以将 combine 函数包裹在 useCallback 中,或者将其提取到一个稳定的函数引用中,如果它没有任何依赖项的话。