重要默认值

开箱即用,TanStack Query 配置了积极但合理的默认值。**有时这些默认值可能会让新用户措手不及,或者如果用户不了解它们,会使学习/调试变得困难。**在您继续学习和使用 TanStack Query 时,请记住这些默认值:

  • 通过 useQueryuseInfiniteQuery 创建的查询实例默认将缓存数据视为过时

要更改此行为,您可以全局配置查询,也可以在每个查询中使用 staleTime 选项进行配置。指定更长的 staleTime 意味着查询将不会那么频繁地重新获取其数据

  • 设置了 staleTime 的查询在其 staleTime 过期之前被认为是新鲜的

    • staleTime 设置为例如 2 * 60 * 1000,以确保数据在 2 分钟内从缓存中读取,而不会触发任何类型的重新获取,或者直到查询被手动失效
    • staleTime 设置为 Infinity 以永不触发重新获取,直到查询被手动失效
    • staleTime 设置为 'static'永不触发重新获取,即使查询被手动失效
  • 过时的查询会在以下情况下自动在后台重新获取:

    • 查询的新实例挂载
    • 窗口重新聚焦
    • 网络重新连接

设置 staleTime 是避免过度重新获取的推荐方法,但您也可以通过设置诸如 refetchOnMountrefetchOnWindowFocusrefetchOnReconnect 之类的选项来自定义重新获取的时间点。

  • 查询可以选择配置 refetchInterval 以定期触发重新获取,这与 staleTime 设置无关。

  • 不再有 useQueryuseInfiniteQuery 或查询观察者的活动实例的查询结果被标记为“非活动”,并保留在缓存中,以备将来再次使用。

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

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

  • 失败的查询会静默重试 3 次,并采用指数退避延迟,然后才会捕获错误并将其显示到 UI。

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

  • 查询结果默认情况下会进行结构共享以检测数据是否实际更改,如果未更改,数据引用将保持不变,以便更好地帮助 useMemouseCallback 实现值稳定。如果这个概念听起来很陌生,那么不用担心!99.9% 的情况下您不需要禁用此功能,它可以在不增加任何成本的情况下提高应用程序的性能。

    结构共享仅适用于与 JSON 兼容的值,任何其他值类型将始终被视为已更改。例如,如果您因响应过大而遇到性能问题,可以使用 config.structuralSharing 标志禁用此功能。如果您在查询响应中处理与 JSON 不兼容的值,并且仍想检测数据是否已更改,则可以提供自己的自定义函数作为 config.structuralSharing 来根据旧响应和新响应计算值,并根据需要保留引用。