ReactQuery(三) Important Defaults [译]
重要的默认值
开箱即用,React Query 配置了激进但合理的默认值。有时,如果用户不知道这些默认设置,可能会让新用户措手不及,或者让学习/调试变得困难。 当你学习和使用 React Query 时,请记住以下规则:
默认情况下,通过
useQuery
或useInfiniteQuery
得到的查询实例(Query instances)将缓存数据(cached data)视为旧数据(stale) 。
更改此行为,您可以使用 staleTime
选项在全局和每个查询中配置您的查询。指定更长的 staleTime
意味着查询不会经常重新获取/请求(refetch )它们的数据
旧数据会在以下情况下在后台自动请求:
查询/请求新的实例(新接口的请求)
浏览器窗口重新聚焦
网络重连
该查询结果( Query results )配置了重新请求数据的时间间隔(可选)
了解上面的触发重新请求条件后,如果你发现了一个你不期望发生的重新请求,这很大可能是你重新聚焦了浏览器窗口,其实是ReactQuery正在执行内置事件 refetchOnWindowFocus
,在开发过程中,触发此事件可能会非常频繁,因为开发者通常会在Devtools和窗口之间来回切换,所以在观察请求现象的时候请注意这一点。
若要更改此功能,可以使用这些选项:refetchOnMount
,refetchOnWindowFocus
,refetchOnReconnect
,refetchInterval
通过
useQuery
或useInfiniteQuery
获取的缓存中的请求数据( Query results ) 没有被正在使用的实例引用,query监听器会把这些实例标记为不活跃的(inactive) ,同时保留在请求缓存中直到实例下次被使用。
默认情况下,不活跃的数据会保存五分钟后被垃圾器回收。
同样的,默认失效的时间可以通过 cacheTime
来配置,单位是ms,默认值是5601000
失败的查询会静默重试 3 次,在捕获错误并将其显示给 UI 之前具有指数退避延迟* 。
自定义重试次数可通过retry
和 retryDelay
来配置。
译者注:
指数退避:* 服务器故障的严重性有时未知。 服务器可能出现临时错误,或者可能完全脱机。 每次尝试都增加重试延迟可能是有益的。重试计数传递给延迟函数,并用于设置setTimeout延迟。
在这种情况下,将10 ^ n用作超时,其中n是重试计数。 换句话说,前5次重试将具有以下延迟:
[1 ms,10 ms,100 ms,1 s,10 s]
代码示例:
const delay = (retryCount) => new Promise((resolve) => setTimeout(resolve, 10 ** retryCount)) const getResource = (retryCount = 0) => apiCall().catch(() => delay(retryCount).then(() => getResource(retryCount + 1)))复制代码
默认情况下,查询结果在结构上是共享( structurally shared ) 的,以检测数据是否实际发生了变化,如果不是,则数据引用保持不变,以更好地帮助稳定有关 useMemo 和 useCallback 的值。 如果这个概念听起来很陌生,那么不要担心! 在 99.9% 的情况下,您不需要禁用它,它可以让您的应用程序以零成本获得更高的性能。
结构共享仅适用于与 JSON 兼容的值,任何其他值类型将始终被视为已更改。 例如,如果您看到由于响应大而导致的性能问题,您可以使用config.structuralSharing
标志禁用此功能。 如果您在查询响应中处理非 JSON 兼容值,并且仍想检测数据是否已更改,您可以使用 config.isDataEqual
定义数据比较函数。
作者:Transon
链接:https://juejin.cn/post/7038267881280241695
伪原创工具 SEO网站优化 https://www.237it.com/