mee*_*t d 39 javascript reactjs react-query
我已阅读 React Query 文档。不过,我不明白如何使用 staleTime 和 cacheTime 进行数据缓存。
我想在第一次 API 调用后将数据存储在缓存中 2 分钟。无论组件是否挂载或卸载,我都不想在第一次获取数据后 2 分钟内调用 API。
我使用了这个,但如果我只使用过时时间,它在 2 分钟后不会调用 API ;如果我只使用缓存时间,它每次都会调用 API(挂载组件和卸载组件)。
那么,问题出在哪里呢?最好的方法是什么?
const query = useQuery(
["getUserList"],
getUserList,
{
staleTime: 120000,
cacheTime: 120000,
}
);
Run Code Online (Sandbox Code Playgroud)
TkD*_*odo 63
无论组件挂载还是卸载,我都不希望在第一次获取数据后 2 分钟内调用 API
这就是我们staleTime正在做的事情。staleTime告诉您数据的新鲜程度。它与 非常相似Cache-Control: max-age=120。
因此,如果您staleTime: 120000在示例中设置 ,则保证在第一个成功请求后的两分钟内不会收到另一个网络请求。
cacheTime是完全不同的东西。将其视为垃圾收集时间。它基本上描述了数据在被垃圾收集之前应在缓存中保留多长时间。这仅与未使用的查询相关,因为根据定义,活动查询不能被垃圾收集。
我还在我的博客中概述了这种差异:
StaleTime:查询从新鲜状态转变为过时状态的持续时间。只要查询是新鲜的,数据将始终只从缓存中读取 - 不会发生网络请求!如果查询过时(默认情况下是:立即),您仍将从缓存中获取数据,但在某些条件下可能会发生后台重新获取。
CacheTime:从缓存中删除非活动查询之前的持续时间。默认为 5 分钟。一旦没有注册观察者,即当使用该查询的所有组件都已卸载时,查询就会转换为非活动状态。
我使用了这个,但 2 分钟后它没有调用 API
这是完全不同的事情。当staleTime时间过去后,您的数据将被标记为过时 - 但这并不意味着它将立即重新获取。staleTime默认为zero这样根本不起作用。
如果您想每 2 分钟获取一次,请设置refetchInterval:
refetchInterval: 120000
Fla*_*che 16
我最近分享了一篇关于 React Query cacheTime 与 staleTime 的文章:https://medium.com/doctolib/react-query-cachetime-vs-staletime-ec74defc483e
\n简而言之,这里有一个思维模型可以帮助您理解:查询分两步进行。
\n首先,React Query 将尝试尽快提供响应。为此,它将查找缓存的值。如果它没有找到有效的(未过期的)缓存,那么它将触发对后端的调用。
\n既然 React Query 已经提供了第一个值,那么就需要花时间考虑过时时间了。所以现在的问题是:这些数据仍然是新鲜的(不是陈旧的)吗?如果是,则意味着之前提供的数据不再被认为是新鲜的,因此我们必须向后端触发第二个请求。
\n第一步是cacheTime;第二个是 staleTime。瞧\xc3\xa0。
\n这是我为自己制作的一个小(不符合 UML)图表:
\n\n希望这种对现实的过度简化能让你更清楚!
\n| 归档时间: |
|
| 查看次数: |
41066 次 |
| 最近记录: |