梗概
SWR 是由 Vercel 开发的 React 数据请求库,名字来源于 “Stale-While-Revalidate”(过期数据优先,同时后台验证更新)的缓存策略。它通过高效处理数据请求、自动缓存、智能重新验证,让数据获取更简单且性能更优。
核心特性
- 自动缓存与重新验证:首次请求后缓存数据,下次访问直接用缓存,同时后台默默重新请求更新数据,保证数据新鲜度
- 聚焦重新验证:页面从后台切回时,自动重新请求数据,确保用户看到最新内容
- 错误重试:请求失败时自动重试,可配置重试次数和间隔
- 依赖请求:支持基于其他数据的动态请求(如根据 ID 加载详情)
- React Suspense 支持:可配合 React Suspense 实现优雅的加载状态管理
基本使用
安装
npm install swr
# 或
yarn add swr基础用法
import useSWR from 'swr';
// 定义数据请求函数(通常是 fetch/axios 等)
const fetcher = (url) => fetch(url).then(res => res.json());
function UserProfile({ userId }) {
// 使用 useSWR hook 请求数据,key 为请求标识(通常是 URL)
const { data, error, isLoading, mutate } = useSWR(
`/api/users/${userId}`, // 请求 key(变化时会重新请求)
fetcher // 数据获取函数
);
// 加载状态
if (isLoading) return <div>Loading...</div>;
// 错误状态
if (error) return <div>Failed to load</div>;
// 数据渲染
return (
<div>
<h1>{data.name}</h1>
<p>{data.email}</p>
{/* 手动触发重新请求 */}
<button onClick={() => mutate()}>刷新数据</button>
</div>
);
}API 参数与返回值
参数
- key:请求的唯一标识(字符串或数组,数组中任意元素变化会触发重新请求)
- fetcher:数据获取函数(接收 key 作为参数,返回 Promise)
- options(可选):配置项,如:
revalidateOnFocus:是否在页面聚焦时重新验证(默认true)retry:重试次数(默认 3 次)dedupingInterval:相同 key 的请求防抖时间(默认 2000ms)
返回值
- data:请求成功的数据(初始为
undefined) - error:请求失败的错误信息(初始为
undefined) - isLoading:是否处于加载中(
data和error都为undefined时为true) - mutate:手动更新数据或重新请求的函数(支持传入新数据直接更新缓存)
与其他方案对比
SWR 与 React Query 都是优秀的数据请求库:
- SWR:轻量、API 简洁,适合简单场景,与 Next.js 配合友好
- React Query:功能更强大,支持复杂查询逻辑、批量操作等,适合大型项目
相比传统的 HTTP缓存,SWR 等客户端数据管理库解决了动态数据的缓存同步、状态管理、主动控制等问题,更适配现代前端的复杂交互场景。
适用场景
- 需要高效缓存和自动更新的数据请求(如列表、详情页)
- 依赖用户交互或其他状态动态变化的请求
- 希望简化加载/错误状态管理的场景
SWR 通过优化缓存策略和请求时机,能有效减少不必要的网络请求,提升用户体验,是 React 项目中处理数据请求的优秀选择。