React SWR: 让请求自动 cache
· 阅读需 9 分钟

现代的 hooks 模型
在用户体验上,前端依然非常依赖和后端之间建立的网络链接。在网络环境良好的情况下,大部分 Web App 都可以提供较好的用户体验。但是随着移动化的浪潮,前端的 App 也越来越多被应用在小程序、h5 等移动环境中,而移动网络的不稳定性和 Web App 的即时渲染,都极大地影响了 Web App 的体验。

通过请求 hooks 对于请求的优化,前端应用更加独立。因为存在 cacheKey、Refetching 等机制,现在我们可以有新的角度去看待 Web App。这个时代下,Web App 更加独立,可以自身缓存一定的数据,也可以更快地响应用户的操作。通过增加静默请求和减少页面全刷新,使网络延迟和数据更新趋于无感。而这一点 ,hooks 和 diff 机制配合得天衣无缝。

mutate(key)和 mutate()
在 React SWR 中,mutate
方法有两种调用方式:mutate(key)
和 mutate()
。它们的主要区别在于作用范围和使用场景。以下是详细的解释:
1. mutate(key)
mutate(key)
是一个全局方法,用于操作特定的缓存键(key)。你可以通过指定 key
来精确地操作某个缓存数据。
参数
key
:指定要操作的缓存键。data
(可选):如果提供,可以直接更新缓存数据。options
(可选):配置选项,例如{ revalidate: true }
。
作用范围
- 全局作用:
mutate(key)
作用于全局缓存,可以跨组件使用。 - 精确操作:通过指定
key
,可以精确地操作某个缓存数据。
示例
import useSWR, { mutate } from 'swr';
const fetcher = url => fetch(url).then(res => res.json());
function MyComponent() {
const { data, error } = useSWR('/api/data', fetcher);
const updateData = async newData => {
try {
// 调用 update API
await fetch('/api/update', {
method: 'POST',
body: JSON.stringify(newData),
headers: { 'Content-Type': 'application/json' },
});
// 重新验证指定的缓存键
mutate('/api/data');
} catch (err) {
console.error('Update failed:', err);
}
};
if (error) return <div>Failed to load</div>;
if (!data) return <div>Loading...</div>;
return (
<div>
<div>{JSON.stringify(data)}</div>
<button onClick={() => updateData({ key: 'value' })}>Update Data</button>
</div>
);
}
2. mutate()
mutate()
是一个绑定到 useSWR
的方法,用于操作当前组件中使用的缓存数据。它不需要显式指定 key
,因为 key
已经在 useSWR
中定义。
参数
data
(可选):如果提供,可以直接更新缓存数据。options
(可选):配置选项,例如{ revalidate: true }
。
作用范围
- 局部作用:
mutate()
作用于当前组件中使用的缓存数据。 - 简化操作:不需要显式指定
key
,直接操作当前组件的缓存。
示例
import useSWR, { mutate } from 'swr';
const fetcher = url => fetch(url).then(res => res.json());
function MyComponent() {
const { data, error, mutate } = useSWR('/api/data', fetcher);
const updateData = async newData => {
try {
// 调用 update API
await fetch('/api/update', {
method: 'POST',
body: JSON.stringify(newData),
headers: { 'Content-Type': 'application/json' },
});
// 重新验证当前组件的缓存数据
mutate();
} catch (err) {
console.error('Update failed:', err);
}
};
if (error) return <div>Failed to load</div>;
if (!data) return <div>Loading...</div>;
return (
<div>
<div>{JSON.stringify(data)}</div>
<button onClick={() => updateData({ key: 'value' })}>Update Data</button>
</div>
);
}
总结
-
mutate(key)
:- 全局作用:可以跨组件操作指定的缓存键。