前端
PythonJava运维数据库
TanStack Query
TanStack Query
  • getting started
    • 快速开始
    • 开发工具
    • Typescript
    • 默认配置
    • 网络模式
  • Query
    • 查询
    • 查询键
    • 查询函数
    • 查询选项
    • 并行查询
    • 有依赖的查询
    • 查询状态指示器
    • 窗口聚焦重新获取数据
    • 禁用/暂停查询
    • 查询重试
    • 分页查询
    • 无限查询
    • 初始化查询数据
  • 占位符
  • Mutation
    • 修改 Mutations
    • 主动查询失效 Query Invalidation
    • 修改导致的失效 Invalidation From Mutations
    • 通过修改的数据更新查询内容
    • 乐观更新
  • 取消查询
  • 默认查询函数
  • 过滤器
  • Suspense
  • 缓存数据
  • Api Reference
    • QueryClient
    • QueryCache
    • MutationCache
    • QueryObserver QueriesObserver
    • InfiniteQueryObserver
    • FocusManager
    • NotifyManager
    • useQuery
    • useQueries useInfiniteQuery
    • useMutation
    • useIsFetching
    • useIsMutating
    • useMutationState
    • useSuspenseQuery
    • useSuspenseInfiniteQuery
    • useSuspenseQueries
    • QueryClientProvider
    • useQueryClient
    • queryOptions
    • infiniteQueryOptions
    • QueryErrorResetBoundary
    • useQueryErrorResetBoundary
    • hydration
由 GitBook 提供支持
在本页

这有帮助吗?

缓存数据

假设我们使用默认的gcTime(5 分钟),默认的staleTime(0)来进行查询。

首先,某个组件中挂载了useQuery({ queryKey: ["todos"], queryFn: fetchTodos })的新实例。

  • 由于目前还没有使用["todos"]作为queryKey的其他查询存在,因此查询将显示加载状态并发送网络请求。

  • 当网络请求完成后,返回的数据将缓存在['todos']键下。

  • 该钩子将在配置的staleTime(默认为 0)之后,将数据标记为过期。

接着useQuery({ queryKey: ["todos"], queryFn: fetchTodos })的第二个实例在其他组件中挂载。

  • 由于缓存中已经有一个['todos']的查询数据,因此该数据会立即从缓存中返回。

  • 新实例使用其查询触发网络请求,无论两个fetchTodos查询函数是否相同,两个查询的状态都会更新(包括isFetching、isPending和其他相关值),因为他们具有相同的查询键。

  • 当请求完成时,对['todos']键下缓存的数据进行更新,并且两个实例都使用新数据进行更新。

useQuery({ queryKey: ["todos"], queryFn: fetchTodos })查询的两个组件实例都已卸载且不再使用。

  • 由于此查询不再有活动的实例,因此使用gcTime设置垃圾回收超时来删除并回收该查询(默认为5 分钟)。

如果在缓存超时之前,有另外一个useQuery({ queryKey: ["todos"], queryFn: fetchTodos })实例挂载。查询会立即返回可用的缓存数据,然后再次根据staleTime来决定是否执行查询函数,如若执行查询函数,则使用新数据更新缓存。

5 分钟内没有出现useQuery({ queryKey: ["todos"], queryFn: fetchTodos })的实例

  • ["todos"]键下的缓存数据将被删除并垃圾回收。

上一页Suspense下一页QueryClient

最后更新于2个月前

这有帮助吗?