在多个地方共享 queryKey 和 queryFn,同时将它们保持在一起的一种最佳方法是使用 queryOptions 助手。在运行时,此助手仅返回您传递给它的任何内容,但当您 与 TypeScript 一起使用时,它具有许多优点。您可以在一个地方定义查询的所有可能选项,并且您还将获得所有这些选项的类型推断和类型安全。
import { queryOptions } from '@tanstack/vue-query'
function groupOptions(id: number) {
return queryOptions({
queryKey: ['groups', id],
queryFn: () => fetchGroups(id),
staleTime: 5 * 1000,
})
}
// usage:
useQuery(groupOptions(1))
useSuspenseQuery(groupOptions(5))
useQueries({
queries: [groupOptions(1), groupOptions(2)],
})
queryClient.prefetchQuery(groupOptions(23))
queryClient.setQueryData(groupOptions(42).queryKey, newGroups)
import { queryOptions } from '@tanstack/vue-query'
function groupOptions(id: number) {
return queryOptions({
queryKey: ['groups', id],
queryFn: () => fetchGroups(id),
staleTime: 5 * 1000,
})
}
// usage:
useQuery(groupOptions(1))
useSuspenseQuery(groupOptions(5))
useQueries({
queries: [groupOptions(1), groupOptions(2)],
})
queryClient.prefetchQuery(groupOptions(23))
queryClient.setQueryData(groupOptions(42).queryKey, newGroups)
对于无限查询,还有一个单独的 infiniteQueryOptions 助手可用。
您仍然可以在组件级别覆盖某些选项。一种非常常见且有用的模式是创建每个组件的 select 函数
// Type inference still works, so query.data will be the return type of select instead of queryFn
const query = useQuery({
...groupOptions(1),
select: (data) => data.groupName,
})
// Type inference still works, so query.data will be the return type of select instead of queryFn
const query = useQuery({
...groupOptions(1),
select: (data) => data.groupName,
})