开箱即用,TanStack Query 都配置了积极但合理的默认值。有时这些默认值可能会让新用户感到意外,或者在用户不知情的情况下使学习/调试变得困难。 在继续学习和使用 TanStack Query 时,请牢记它们。
要更改此行为,您可以使用 staleTime 选项全局或按查询配置您的查询。指定更长的 staleTime 意味着查询不会那么频繁地重新获取数据。
设置了 staleTime 的查询在 staleTime 过去之前被认为是新鲜的。
过时查询会在以下情况下自动在后台重新获取:
设置 staleTime 是避免过度重新获取的推荐方法,但您也可以通过设置 refetchOnMount、refetchOnWindowFocus 和 refetchOnReconnect 等选项来自定义重新获取的时间点。
查询可以配置 refetchInterval 来周期性地触发重新获取,这独立于 staleTime 设置。
不再有活动的 injectQuery、injectInfiniteQuery 或查询观察者的查询结果被标记为“不活动”,并保留在缓存中,以防将来再次使用。
默认情况下,“非活动”查询在 5 分钟后被垃圾回收。
要更改此行为,您可以将查询的默认 gcTime 从 1000 * 60 * 5 毫秒更改为其他值。
失败的查询会静默重试 3 次,并采用指数退避延迟,然后才会捕获并向 UI 显示错误。
要更改此行为,您可以将查询的默认 retry 和 retryDelay 选项从 3 和默认的指数退避函数更改为其他值。
查询结果默认是结构共享的,以检测数据是否真的发生了变化,如果未更改,数据引用保持不变,以更好地实现与设置信号值相关的数值稳定性。如果这个概念对您来说很陌生,请不要担心! 99.9% 的情况下您不需要禁用它,它能在零成本的情况下提高您的应用程序性能。
结构共享仅适用于 JSON 兼容值,任何其他值类型都将被视为已更改。如果您因为响应体过大而遇到性能问题,例如,您可以使用 config.structuralSharing 标志禁用此功能。如果您在查询响应中处理非 JSON 兼容值,但仍希望检测数据是否已更改,您可以提供自己的自定义函数作为 config.structuralSharing,以根据旧响应和新响应计算一个值,并在需要时保留引用。