跳至内容
文档
自动重新验证

自动重新验证

💡

如果你想手动重新验证数据,请查看 突变.

在焦点时重新验证

当你重新聚焦页面或在标签之间切换时,SWR 会自动重新验证数据。

这对于立即同步到最新状态很有用。这对于刷新数据很有帮助,例如过时的移动标签或 **进入睡眠状态** 的笔记本电脑。

视频:使用焦点重新验证在页面之间自动同步登录状态。

此功能默认启用。你可以通过 revalidateOnFocus 选项禁用它。

按间隔重新验证

在很多情况下,数据会因为多个设备、多个用户、多个标签而发生变化。我们如何随着时间的推移更新屏幕上的数据?

SWR 会给你自动重新获取数据的选项。它很 **智能**,这意味着重新获取只会在与钩子相关的组件 **在屏幕上** 时才发生。

视频:当用户进行更改时,两个会话最终都会呈现相同的数据。

你可以通过设置 refreshInterval 值来启用它。

useSWR('/api/todos', fetcher, { refreshInterval: 1000 })

还有一些选项,例如 refreshWhenHiddenrefreshWhenOffline。两者默认禁用,因此 SWR 不会在网页不在屏幕上或没有网络连接时进行获取。

在重新连接时重新验证

在用户重新上线时重新验证也很有用。这种情况经常发生在用户解锁他们的电脑时,但互联网并没有同时连接。

为了确保数据始终是最新的,SWR 会在网络恢复时自动重新验证。

此功能默认启用。你可以通过 revalidateOnReconnect 选项禁用它。

禁用自动重新验证

如果资源是 **不可变的**,如果我们再次重新验证,它将永远不会改变,我们可以禁用所有类型的自动重新验证。

从 1.0 版本开始,SWR 提供了一个辅助钩子 useSWRImmutable 来标记资源为不可变的。

import useSWRImmutable from 'swr/immutable'
 
// ...
useSWRImmutable(key, fetcher, options)

它与正常的 useSWR 钩子具有相同的 API 接口。你也可以通过禁用以下重新验证选项来实现相同的效果。

useSWR(key, fetcher, {
  revalidateIfStale: false,
  revalidateOnFocus: false,
  revalidateOnReconnect: false
})
 
// equivalent to
useSWRImmutable(key, fetcher)

revalidateIfStale 控制 SWR 是否应该在挂载时重新验证,以及是否存在过时数据。

上面的两个钩子做的事情 **完全相同**。一旦数据被缓存,它们将不再请求它。

在挂载时重新验证

强制覆盖 SWR 在挂载时重新验证很有用。默认情况下,revalidateOnMount 的值为 undefined。

SWR 钩子挂载为

  • 首先它检查 revalidateOnMount 是否已定义。如果为真,则开始请求,如果为假,则停止。

revalidateIfStale 用于控制挂载行为。默认情况下,revalidateIfStale 设置为 true。

如果 revalidateIfStale 设置为 true,它只会在存在缓存数据时重新获取,否则它不会重新获取。