React SWR:让请求自动 cache
· 7 min read

现代的 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,直接操作当前组件的缓存。