框架
版本

网络模式

TanStack Query 提供了三种不同的网络模式,用于区分在没有网络连接时 Queries 和 Mutations 应该如何表现。此模式可以为每个 Query / Mutation 单独设置,也可以通过 query / mutation 默认值全局设置。

由于 TanStack Query 最常用于数据获取,并结合数据获取库一起使用,因此默认网络模式为 online。

网络模式:online

在此模式下,除非您有网络连接,否则 Queries 和 Mutations 不会触发。这是默认模式。如果为 query 发起获取,如果由于没有网络连接而无法进行获取,它将始终保持其所处的状态 (pendingerrorsuccess)。但是,还会额外公开一个 fetchStatus。它可以是:

  • fetching:queryFn 正在真正执行 - 请求正在传输中。
  • paused:query 未执行 - 它已暂停,直到您再次连接。
  • idle:query 未获取且未暂停。

标志 isFetchingisPaused 从此状态派生出来,并为了方便而公开。

请记住,可能仅检查 pending 状态以显示加载指示器是不够的。如果 Queries 首次挂载且您没有网络连接,则它们可能处于 state: 'pending',但 fetchStatus: 'paused'

如果 query 因为您在线而运行,但在获取仍在进行时您离线,TanStack Query 也会暂停重试机制。当您重新获得网络连接后,暂停的 query 将继续运行。这与 refetchOnReconnect(在此模式下也默认为 true)无关,因为它不是 refetch,而是 continue。如果 query 在此期间已被取消,则它将不会继续。

网络模式:always

在此模式下,TanStack Query 将始终获取并忽略在线/离线状态。如果您在不需要活动网络连接即可使 Queries 工作的环境中使用 TanStack Query,则这可能是您想要选择的模式 - 例如,如果您只是从 AsyncStorage 读取,或者您只是想从您的 queryFn 返回 Promise.resolve(5)

  • Queries 永远不会因为您没有网络连接而暂停
  • 重试也不会暂停 - 您的 Query 如果失败将进入 error 状态。
  • 在此模式下,refetchOnReconnect 默认为 false,因为重新连接到网络不再是陈旧的 query 应该重新获取的良好指标。如果您愿意,仍然可以打开它。

网络模式:offlineFirst

此模式是前两个选项之间的中间地带,其中 TanStack Query 将运行一次 queryFn,然后暂停重试。如果您有一个 serviceWorker 拦截缓存请求(如在 offline-first PWA 中),或者您通过 Cache-Control header 使用 HTTP 缓存,这将非常方便。

在这些情况下,第一次获取可能会成功,因为它来自离线存储/缓存。但是,如果发生缓存未命中,则网络请求将发出并失败,在这种情况下,此模式的行为类似于 online query - 暂停重试。

Devtools

如果 Queries 本应正在获取,但没有网络连接,则 TanStack Query Devtools 将以 paused 状态显示 Queries。还有一个切换按钮可以“模拟离线行为”。请注意,此按钮实际上不会干扰您的网络连接(您可以在浏览器 devtools 中执行此操作),但它会将 OnlineManager 设置为离线状态。

签名

  • networkMode: 'online' | 'always' | 'offlineFirst'
    • 可选
    • 默认为 'online'