QueryClient
queryClient.fetchQuery
queryClient.fetchInfiniteQuery
queryClient.prefetchQuery
queryClient.prefetchInfiniteQuery
queryClient.getQueryData
queryClient.ensureQueryData
queryClient.ensureInfiniteQueryData
queryClient.getQueriesData
queryClient.setQueryData
queryClient.getQueryState
queryClient.setQueriesData
queryClient.invalidateQueries
queryClient.refetchQueries
queryClient.cancelQueries
queryClient.removeQueries
queryClient.resetQueries
queryClient.isFetching
QueryClient 可用于与缓存进行交互:
import { QueryClient } from '@tanstack/react-query'
const queryClient = new QueryClient({
defaultOptions: {
queries: {
staleTime: Infinity,
},
},
})
await queryClient.prefetchQuery({ queryKey: ['posts'], queryFn: fetchPosts })
import { QueryClient } from '@tanstack/react-query'
const queryClient = new QueryClient({
defaultOptions: {
queries: {
staleTime: Infinity,
},
},
})
await queryClient.prefetchQuery({ queryKey: ['posts'], queryFn: fetchPosts })
其提供的方法包括:
选项
fetchQuery 是一个异步方法,用于获取并缓存查询。它将返回数据或抛出错误。如果只需要获取查询而不需要结果,请使用 prefetchQuery 方法。
如果查询存在且数据未失效或未超过给定的 staleTime,则返回缓存中的数据。否则会尝试获取最新数据。
try {
const data = await queryClient.fetchQuery({ queryKey, queryFn })
} catch (error) {
console.log(error)
}
try {
const data = await queryClient.fetchQuery({ queryKey, queryFn })
} catch (error) {
console.log(error)
}
指定 staleTime 以仅在数据超过一定时间后才重新获取:
try {
const data = await queryClient.fetchQuery({
queryKey,
queryFn,
staleTime: 10000,
})
} catch (error) {
console.log(error)
}
try {
const data = await queryClient.fetchQuery({
queryKey,
queryFn,
staleTime: 10000,
})
} catch (error) {
console.log(error)
}
选项
fetchQuery 的选项与 useQuery 完全相同,除了以下专用于 useQuery 和 useInfiniteQuery 的选项:enabled, refetchInterval, refetchIntervalInBackground, refetchOnWindowFocus, refetchOnReconnect, refetchOnMount, notifyOnChangeProps, throwOnError, select, suspense, placeholderData。更多细节可查看 源代码。
返回值
fetchInfiniteQuery 类似于 fetchQuery,但可用于获取并缓存无限查询。
try {
const data = await queryClient.fetchInfiniteQuery({ queryKey, queryFn })
console.log(data.pages)
} catch (error) {
console.log(error)
}
try {
const data = await queryClient.fetchInfiniteQuery({ queryKey, queryFn })
console.log(data.pages)
} catch (error) {
console.log(error)
}
选项
fetchInfiniteQuery 的选项与 fetchQuery 完全相同。
返回值
prefetchQuery 是一个异步方法,用于在需要或通过 useQuery 等渲染之前预取查询。该方法与 fetchQuery 的工作方式相同,只是不会抛出错误或返回任何数据。
await queryClient.prefetchQuery({ queryKey, queryFn })
await queryClient.prefetchQuery({ queryKey, queryFn })
甚至可以在配置中使用默认的 queryFn!
await queryClient.prefetchQuery({ queryKey })
await queryClient.prefetchQuery({ queryKey })
选项
prefetchQuery 的选项与 fetchQuery 完全相同。
返回值
prefetchInfiniteQuery 类似于 prefetchQuery,但可用于预取并缓存无限查询。
await queryClient.prefetchInfiniteQuery({ queryKey, queryFn })
await queryClient.prefetchInfiniteQuery({ queryKey, queryFn })
选项
prefetchInfiniteQuery 的选项与 fetchQuery 完全相同。
返回值
getQueryData 是一个同步函数,用于获取现有查询的缓存数据。如果查询不存在,则返回 undefined。
const data = queryClient.getQueryData(queryKey)
const data = queryClient.getQueryData(queryKey)
选项
返回值
ensureQueryData 是一个异步函数,用于获取现有查询的缓存数据。如果查询不存在,则会调用 queryClient.fetchQuery 并返回其结果。
const data = await queryClient.ensureQueryData({ queryKey, queryFn })
const data = await queryClient.ensureQueryData({ queryKey, queryFn })
选项
返回值
ensureInfiniteQueryData 是一个异步函数,用于获取现有无限查询的缓存数据。如果查询不存在,则会调用 queryClient.fetchInfiniteQuery 并返回其结果。
const data = await queryClient.ensureInfiniteQueryData({
queryKey,
queryFn,
initialPageParam,
getNextPageParam,
})
const data = await queryClient.ensureInfiniteQueryData({
queryKey,
queryFn,
initialPageParam,
getNextPageParam,
})
选项
返回值
getQueriesData 是一个同步函数,用于获取多个查询的缓存数据。仅返回匹配传入的 queryKey 或 queryFilter 的查询。如果没有匹配的查询,则返回空数组。
const data = queryClient.getQueriesData(filters)
const data = queryClient.getQueriesData(filters)
选项
返回值
注意事项
由于每个元组中的返回数据结构可能不同(例如,使用过滤器返回“活跃”查询可能返回不同的数据类型),TData 泛型默认为 unknown。如果为 TData 提供更具体的类型,则假定您确定每个元组的数据条目均为相同类型。
这一区别主要是为知道将返回哪种结构的 TypeScript 开发者提供的“便利”。
setQueryData 是一个同步函数,用于立即更新查询的缓存数据。如果查询不存在,则会创建它。如果查询在默认的 gcTime(5 分钟)内未被查询钩子使用,该查询将被垃圾回收。要同时更新多个查询并部分匹配查询键,需使用 queryClient.setQueriesData。
使用 setQueryData 和 fetchQuery 的区别在于,setQueryData 是同步的,并假定您已经同步获取了数据。如果需要异步获取数据,建议重新获取查询键或使用 fetchQuery 处理异步获取。
queryClient.setQueryData(queryKey, updater)
queryClient.setQueryData(queryKey, updater)
选项
使用更新值
setQueryData(queryKey, newData)
setQueryData(queryKey, newData)
如果值为 undefined,则不会更新查询数据。
使用更新函数
为了方便语法,也可以传入一个接收当前数据值并返回新数据的更新函数:
setQueryData(queryKey, (oldData) => newData)
setQueryData(queryKey, (oldData) => newData)
如果更新函数返回 undefined,则不会更新查询数据。如果更新函数接收到 undefined 作为输入,可以返回 undefined 以取消更新,从而不创建新的缓存条目。
不可变性
通过 setQueryData 进行的更新必须以不可变方式执行。不要尝试通过直接修改 oldData 或通过 getQueryData 检索的数据来写入缓存。
getQueryState 是一个同步函数,用于获取现有查询的状态。如果查询不存在,则返回 undefined。
const state = queryClient.getQueryState(queryKey)
console.log(state.dataUpdatedAt)
const state = queryClient.getQueryState(queryKey)
console.log(state.dataUpdatedAt)
选项
setQueriesData 是一个同步函数,通过使用过滤器函数或部分匹配查询键,可以立即更新多个查询的缓存数据。仅更新匹配传入的 queryKey 或 queryFilter 的查询——不会创建新的缓存条目。底层会为每个现有查询调用 setQueryData。
queryClient.setQueriesData(filters, updater)
queryClient.setQueriesData(filters, updater)
选项
invalidateQueries 方法可用于根据查询键或查询的其他功能可访问属性/状态,使缓存中的单个或多个查询失效并重新获取。默认情况下,所有匹配的查询会立即标记为失效,并在后台重新获取活跃查询。
await queryClient.invalidateQueries(
{
queryKey: ['posts'],
exact,
refetchType: 'active',
},
{ throwOnError, cancelRefetch },
)
await queryClient.invalidateQueries(
{
queryKey: ['posts'],
exact,
refetchType: 'active',
},
{ throwOnError, cancelRefetch },
)
选项
refetchQueries 方法可用于根据特定条件重新获取查询。
示例:
// 重新获取所有查询:
await queryClient.refetchQueries()
// 重新获取所有过时的查询:
await queryClient.refetchQueries({ stale: true })
// 重新获取所有部分匹配查询键的活跃查询:
await queryClient.refetchQueries({ queryKey: ['posts'], type: 'active' })
// 重新获取所有精确匹配查询键的活跃查询:
await queryClient.refetchQueries({
queryKey: ['posts', 1],
type: 'active',
exact: true,
})
// 重新获取所有查询:
await queryClient.refetchQueries()
// 重新获取所有过时的查询:
await queryClient.refetchQueries({ stale: true })
// 重新获取所有部分匹配查询键的活跃查询:
await queryClient.refetchQueries({ queryKey: ['posts'], type: 'active' })
// 重新获取所有精确匹配查询键的活跃查询:
await queryClient.refetchQueries({
queryKey: ['posts', 1],
type: 'active',
exact: true,
})
选项
返回值
此方法返回一个 Promise,在所有查询完成重新获取后解析。默认情况下,如果任何查询重新获取失败,它不会抛出错误,但可以通过将 throwOnError 选项设置为 true 来配置。
cancelQueries 方法可用于根据查询键或查询的其他功能可访问属性/状态,取消正在进行的查询。
这在执行乐观更新时非常有用,因为您可能需要取消任何正在进行的查询重新获取,以免它们在解析时覆盖您的乐观更新。
await queryClient.cancelQueries({ queryKey: ['posts'], exact: true })
await queryClient.cancelQueries({ queryKey: ['posts'], exact: true })
选项
返回值
此方法不返回任何内容
removeQueries 方法可用于根据查询键或查询的其他功能可访问属性/状态,从缓存中移除查询。
queryClient.removeQueries({ queryKey, exact: true })
queryClient.removeQueries({ queryKey, exact: true })
选项
返回值
此方法不返回任何内容
resetQueries 方法可用于根据查询键或查询的其他功能可访问属性/状态,将缓存中的查询重置为其初始状态。
这将通知订阅者——与 clear 不同,后者会移除所有订阅者——并将查询重置为预加载状态——与 invalidateQueries 不同。如果查询有 initialData,查询的数据将重置为该值。如果查询是活跃的,则会重新获取。
queryClient.resetQueries({ queryKey, exact: true })
queryClient.resetQueries({ queryKey, exact: true })
选项
返回值
此方法返回一个 Promise,在所有活跃查询完成重新获取后解析。
isFetching 方法返回一个 integer,表示缓存中当前正在获取(包括后台获取、加载新页面或加载更多无限查询结果)的查询数量(如果有)。
if (queryClient.isFetching()) {
console.log('至少有一个查询
if (queryClient.isFetching()) {
console.log('至少有一个查询