框架
版本

缓存示例

请仔细阅读 重要默认设置,然后再阅读本指南

基本示例

此缓存示例说明了以下内容的历程和生命周期:

  • 有缓存数据和无缓存数据的查询实例
  • 后台重新获取
  • 不活跃的查询
  • 垃圾回收

让我们假设我们使用的默认 gcTime5 分钟,默认的 staleTime0

  • 初始化了一个新的 injectQuery(() => ({ queryKey: ['todos'], queryFn: fetchTodos })) 实例。
    • 由于没有其他查询使用 ['todos'] 查询键,此查询将显示硬加载状态并发出网络请求以获取数据。
    • 当网络请求完成后,返回的数据将以 ['todos'] 键缓存在缓存中。
    • 该数据将在配置的 staleTime(默认为 0,即立即)之后被标记为 stale。
  • 在其他地方初始化了第二个 injectQuery(() => ({ queryKey: ['todos'], queryFn: fetchTodos }) 实例。
    • 由于缓存中已经有第一个查询的 ['todos'] 键的数据,所以该数据会立即从缓存中返回。
    • 新实例使用其查询函数触发新的网络请求。
      • 请注意,无论这两个 fetchTodos 查询函数是否相同,这两个查询的 status 都会更新(包括 isFetchingisPending 以及其他相关值),因为它们具有相同的查询键。
    • 当请求成功完成时,['todos'] 键下的缓存数据将更新为新数据,并且两个实例都将更新为新数据。
  • injectQuery(() => ({ queryKey: ['todos'], queryFn: fetchTodos }) 查询的两个实例都被销毁,不再使用。
    • 由于不再有该查询的活动实例,因此使用 gcTime 设置了一个垃圾回收超时时间来删除和垃圾回收该查询(默认为 5 分钟)。
  • 在缓存超时完成之前,又有一个 injectQuery(() => ({ queryKey: ['todos'], queyFn: fetchTodos }) 实例挂载。查询会立即返回可用的缓存数据,同时 fetchTodos 函数会在后台运行。当它成功完成后,它将用新数据填充缓存。
  • injectQuery(() => ({ queryKey: ['todos'], queryFn: fetchTodos }) 的最后一个实例被销毁。
  • 5 分钟 内没有出现更多的 injectQuery(() => ({ queryKey: ['todos'], queryFn: fetchTodos }) 实例。
    • ['todos'] 键下的缓存数据被删除并进行垃圾回收。

有关更高级的用例,请参阅 injectQuery