阅读 190

ReactQuery(三) Important Defaults [译]

重要的默认值

开箱即用,React Query 配置了激进但合理的默认值。有时,如果用户不知道这些默认设置,可能会让新用户措手不及,或者让学习/调试变得困难。 当你学习和使用 React Query 时,请记住以下规则:

  • 默认情况下,通过 useQuery useInfiniteQuery 得到的查询实例(Query instances)将缓存数据cached data)视为旧数据(stale)

更改此行为,您可以使用 staleTime 选项在全局和每个查询中配置您的查询。指定更长的 staleTime 意味着查询不会经常重新获取/请求(refetch )它们的数据

  • 旧数据会在以下情况下在后台自动请求:

    • 查询/请求新的实例(新接口的请求)

    • 浏览器窗口重新聚焦

    • 网络重连

    • 该查询结果( Query results )配置了重新请求数据的时间间隔(可选)

了解上面的触发重新请求条件后,如果你发现了一个你不期望发生的重新请求,这很大可能是你重新聚焦了浏览器窗口,其实是ReactQuery正在执行内置事件 refetchOnWindowFocus,在开发过程中,触发此事件可能会非常频繁,因为开发者通常会在Devtools和窗口之间来回切换,所以在观察请求现象的时候请注意这一点。

若要更改此功能,可以使用这些选项:refetchOnMountrefetchOnWindowFocusrefetchOnReconnectrefetchInterval

  • 通过 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/ 


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐