You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Query中staleTime=Infinity且cacheTime=0时数据不重取的原理

React Query: 当 staleTime=Infinity + cacheTime=0 时的运行机制

核心概念澄清

  • staleTime=Infinity:直接标记数据为永久新鲜状态,只要数据存在,React Query不会因任何背景刷新触发点(窗口聚焦、网络恢复、轮询等)主动发起重取。这是优先级最高的规则,覆盖所有自动刷新逻辑。
  • cacheTime=0:仅作用于非活跃(inactive)查询——当组件卸载后,该查询的缓存会被立即标记为可垃圾回收状态,但JS引擎的垃圾回收是异步执行的,并非同步清除内存。另外,只要查询处于活跃(active)状态(有组件正在使用该查询),cacheTime的设置完全无效,活跃查询的缓存会一直保留。

你的疑问拆解解答

  1. 窗口聚焦为何不触发重取?
    因为staleTime=Infinity已经将数据标记为永久新鲜,React Query的背景刷新逻辑仅对过期(stale)数据生效。只要数据处于新鲜状态,无论缓存是否存在,都不会触发自动重取。

  2. 组件卸载后缓存被回收,为何数据还能保留?

    • 组件卸载后查询转为inactive,cacheTime=0会让React Query立即标记该缓存为可回收,但垃圾回收并非同步执行,在回收完成前,数据可能仍残留在内存中。
    • 若之后组件重新挂载,React Query会优先读取内存中残留的缓存数据,同时因为staleTime=Infinity,数据依然处于新鲜状态,因此不会发起新请求。只有当垃圾回收彻底清理了缓存,才会触发初始请求。
  3. 无缓存时为何不重取?
    只有当查询完全没有任何缓存数据(包括内存残留)且组件处于活跃状态时,才会发起初始请求。只要还有残留缓存,加上staleTime的新鲜标记,就会直接复用缓存数据,不会触发重取。

关键细节补充

  • React Query的缓存分为活跃缓存和非活跃缓存:活跃缓存绑定在正在被使用的查询上,不受cacheTime限制;非活跃缓存才会受cacheTime控制,超时后被标记为可回收。
  • staleTime的优先级高于所有自动刷新触发条件,只要数据处于新鲜状态,就不会触发任何自动重取行为。

内容的提问来源于stack exchange,提问作者PavitraK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 15:52:05