自动重新验证
如果你想手动重新验证数据,请查看 突变.
在焦点时重新验证
当你重新聚焦页面或在标签之间切换时,SWR 会自动重新验证数据。
这对于立即同步到最新状态很有用。这对于刷新数据很有帮助,例如过时的移动标签或 **进入睡眠状态** 的笔记本电脑。
此功能默认启用。你可以通过 revalidateOnFocus
选项禁用它。
按间隔重新验证
在很多情况下,数据会因为多个设备、多个用户、多个标签而发生变化。我们如何随着时间的推移更新屏幕上的数据?
SWR 会给你自动重新获取数据的选项。它很 **智能**,这意味着重新获取只会在与钩子相关的组件 **在屏幕上** 时才发生。
你可以通过设置 refreshInterval
值来启用它。
useSWR('/api/todos', fetcher, { refreshInterval: 1000 })
还有一些选项,例如 refreshWhenHidden
和 refreshWhenOffline
。两者默认禁用,因此 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,它只会在存在缓存数据时重新获取,否则它不会重新获取。