缓存数据
假设我们使用默认的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"]
键下的缓存数据将被删除并垃圾回收。
最后更新于
这有帮助吗?