Skip to main content

Important Defaults

TanStack Query在开箱即用时,使用了合理但具有侵略性的默认配置。有时,这些默认配置可能会让新用户感到困惑,如果用户不了解这些配置,可能会导致学习和调试困难。在继续学习和使用TanStack Query时,请记住以下内容:

  • 默认情况下,通过useQuery或useInfiniteQuery实例化的查询会将缓存数据视为过时(stale)。

要更改此行为,可以使用staleTime选项在全局和每个查询上进行配置。指定较长的staleTime意味着查询不会经常重新获取数据。

  • 当满足以下条件时,过时的查询(Stale queries)会自动在后台进行重新获取:

    • 查询实例挂载时
    • 窗口重新聚焦时
    • 网络重新连接时
    • 查询可选地配置了重新获取间隔

如果你看到一个意外的重新获取,很可能是因为你刚刚聚焦了窗口,而TanStack Query正在进行窗口聚焦重新获取。在开发过程中,这可能会更频繁地触发,特别是因为在浏览器开发工具和你的应用之间切换聚焦也会触发获取,所以要注意这一点。

要更改此功能,可以使用选项,如 refetchOnMountrefetchOnWindowFocusrefetchOnReconnectrefetchInterval

  • 没有任何使用useQuery、useInfiniteQuery或查询观察器的查询实例的查询结果被标记为“不活跃”,并在缓存中保留,以防以后再次使用。

  • 默认情况下,“不活跃”的查询将在5分钟后进行垃圾回收。

要更改此设置,可以将查询的默认cacheTime更改为除了1000 * 60 * 5毫秒之外的其他值。

  • 查询失败时会进行静默重试,最多重试3次,重试时采用指数退避延迟,然后才会捕获并显示错误到用户界面。

要更改此设置,可以将查询的默认retryretryDelay选项更改为除了3和默认指数退避函数之外的其他值。

  • 默认情况下,查询结果使用结构共享,以检测数据是否实际发生了变化,如果没有变化,则数据引用保持不变,以更好地帮助使用useMemouseCallback进行值稳定化。如果这个概念听起来很陌生,那么不必担心!99.9%的情况下,你不需要禁用它,它可以让你的应用在性能方面更高效,而不需要额外的成本。

结构共享仅适用于JSON兼容的值,任何其他值类型都将被视为已更改。如果由于大型响应而出现性能问题,例如,你可以使用config.structuralSharing标志禁止此功能。如果在查询响应中处理非JSON兼容的值,并且仍然希望检测数据是否发生了变化,可以使用config.isDataEqual定义数据比较函数,或者提供自定义函数作为config.structuralSharing来计算旧响应和新响应的值,并根据需要保留引用。