添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
深情的小刀  ·  缓存 – SWR·  4 周前    · 
笑点低的小摩托  ·  What does Wellerman mean?·  4 月前    · 
慷慨的黄豆  ·  AOE_航伟光电-芯查查·  5 月前    · 
Skip to content
文档
高级
缓存

缓存

💡

升级到最新版本(≥ 1.0.0)来使用该功能。

⚠️

在大多数情况下,你不应该直接 写入 缓存,这可能会导致 SWR 不可预知的行为。如果你需要手动操作一个 key,请考虑使用 SWR API。
参见: 数据更改 重置测试用例之间的缓存

默认情况下,SWR 使用全局缓存在所有组件之间存储和共享数据。但你也可以通过 SWRConfig provider 选项来自定义这个行为。

缓存 provider 旨在通过更多自定义存储启用 SWR。

缓存 Provider

缓存 provider 是类似 Map 的对象,它匹配以下 TypeScript 定义(可以从 swr 导入):

interface Cache<Data> {
  get(key: string): Data | undefined
  set(key




    
: string, value: Data): void
  delete(key: string): void
  keys(): IterableIterator<string>

例如,一个 JavaScript Map (opens in a new tab) 实例可以直接用作 SWR 的缓存 provider。

创建缓存 Provider

SWRConfigprovider 选项接收一个返回缓存 provider 的函数。该 provider 将被 SWRConfig 范围内的所有 SWR hook 使用。例如:

import useSWR, { SWRConfig } from 'swr'
function App() {
  return (
    <SWRConfig value={{ provider: () => new Map() }}>
      <Page/>
    </SWRConfig>

<Page/> 中的所有 SWR hook 都将从该 Map 实例读取和写入。你还可以针对你的特定用例使用其他缓存 provider 实现。

💡

在上面的例子中,当 <App/> 组件重新挂载时,provider 也会被重新创建。缓存 provider 应该放在组件树的更高位置,或者放在渲染之外。

当嵌套时,SWR hook 将使用上层缓存 provider。如果没有上层缓存 provider,则回退到默认 provider,即一个空 Map

⚠️

如果使用了缓存 provider,则全局 mutate适用于 <SWRConfig> 范围内的 SWR hook。请使用访问当前缓存 Provider 代替。

访问当前缓存 Provider

在 React 组件内部,你需要使用 useSWRConfig hook 来访问当前缓存 provider 以及其他配置,包括 mutate

import { useSWRConfig } from 'swr'
function Avatar() {
  const { cache, mutate, ...extraConfig } = useSWRConfig()
  // ...

如果不在任何 <SWRConfig> 中,将返回默认配置。

实验性:扩展缓存 provider

🧪

这是一个实验性的功能,在未来的升级中可能会发生变化。

当多个 <SWRConfig> 组件嵌套时,可以扩展缓存 provider。

provider 函数的第一个参数是上层 <SWRConfig> 的缓存 provider(如果没有父级 <SWRConfig>,则为默认缓存),你可以使用它来扩展缓存 provider:

<SWRConfig value={{ provider: (cache) => newCache }}>
</SWRConfig>

基于 LocalStorage 的持久缓存

你可能希望将缓存同步到 localStorage。下面是一个示例实现: