useSWR 钩子:获取、加载与错误状态
将 useSWR 与自定义获取函数结合使用,以声明式方式处理加载、错误和成功状态
useSWR 钩子:获取、加载与错误状态 是 CoddyKit 上的免费 React Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 React Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 React Academy 课程共包含 4 节课。
useSWR 的签名
useSWR(key, fetcher, options) 是主要钩子。key 是缓存键(通常是 URL 字符串),fetcher 是返回数据的异步函数,options 是可选的配置对象。
该钩子会返回一个包含 data、error、isLoading、isValidating 和 mutate 函数的对象。
key 参数
key 可以是字符串 URL、由 [url, params] 组成的数组,也可以是 null。字符串键对应简单的 GET 请求。数组键允许您将 userId 或过滤条件等变量嵌入缓存标识中。
传入 null 会完全停用请求,这对于所需数据尚未可用时进行条件获取非常有用。
fetcher 函数
fetcher 会接收 key(或者将数组键展开为参数),并且必须返回一个 Promise。解析后的值会成为 data。如果 fetcher 抛出异常,就会设置 error 属性。
示例:(url) => fetch(url).then(r => { if (!r.ok) throw new Error(r.status); return r.json(); }).
数据与错误状态
首次加载时,data 的值为 undefined;成功后,它会等于 fetcher 返回的解析值。除非 fetcher 抛出异常,否则 error 的值为 undefined;如果发生异常,它会保存抛出的错误对象。
请检查 if (error) 以渲染错误消息,并检查 if (!data) 以渲染加载骨架屏,从而提供清晰的备用界面。
isLoading 与 isValidating
只有在没有缓存数据且请求正在进行时,isLoading 才为 true,也就是该键首次加载时。只要有请求正在进行,isValidating 就为 true,包括已有缓存数据时的后台重新验证。
请使用 isLoading 显示骨架屏,使用 isValidating 显示一个不显眼的加载指示器,以表示后台刷新。
全局 SWRConfig
SWRConfig 允许您为其子树中的所有 useSWR 调用定义默认 fetcher、dedupingInterval、refreshInterval、onError 处理函数和其他选项。这样可以集中管理配置,而不必在每个钩子中重复选项。
您可以嵌套多个 SWRConfig 提供者,为应用的不同部分设置不同的默认值。
使用 Null 键进行条件获取
将 null 作为键传入即可跳过请求:useSWR(isLoggedIn ? '/api/user' : null, fetcher)。在键变为非 null 值之前,SWR 不会发起获取。
这比 React Query 中的 skip 选项更简洁。当键从 null 变为字符串时,会自动触发首次获取。
依赖式获取
您可以为有依赖关系的请求串联 SWR 钩子:const { data: user } = useSWR('/api/me', fetcher),然后 const { data: orders } = useSWR(user ? '/api/orders/' + user.id : null, fetcher)。第二个钩子会等待第一个钩子完成。
这种模式避免了 useEffect 链,同时让数据依赖关系保持声明式且易于阅读。
请求去重实战
如果 Header 组件和 Sidebar 组件都调用 useSWR('/api/user', fetcher),SWR 只会发出一个请求并共享结果。当数据或错误更新时,两个组件会一起重新渲染。
这种去重会在 dedupingInterval 时间窗口内自动发生(默认 2000 毫秒),无需任何额外配置。
实用的 SWR 选项
refreshInterval: 5000 表示每 5 秒轮询一次。refreshWhenHidden: false 表示标签页不可见时停止轮询。shouldRetryOnError: false 表示停用自动重试。revalidateOnFocus: false 表示停用由获得焦点触发的重新验证。
请组合使用这些选项,以满足数据新鲜度要求:仪表板通常使用 refreshInterval,而静态内容可以设置 revalidateOnFocus: false。
使用 useSWR 实现分页
对于分页数据,请将页码包含在键中:useSWR(['/api/items', page], fetcher)。切换页面会为该页面触发新的获取,同时缓存之前的页面。
SWR 还提供 useSWRInfinite,用于基于游标或无限滚动的模式,并通过 getKey 函数根据页面索引和上一页数据构建键。
将 SWR 键设为 null
将 null 作为 useSWR 的键传入时会发生什么?
课程回顾
useSWR(key, fetcher) 会返回 data、error、isLoading 和 isValidating。null 键会停用条件获取和依赖式获取。isLoading 表示首次加载,isValidating 表示任意正在进行的请求。SWRConfig 可以集中管理默认值,组件之间的请求去重会自动完成。
refreshInterval、revalidateOnFocus 和 shouldRetryOnError 等选项可以针对每个钩子或全局配置,细致调整数据新鲜度行为。
常见问题解答
「useSWR 钩子:获取、加载与错误状态」课时是免费的吗?
是的 — 「useSWR 钩子:获取、加载与错误状态」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 React Academy 课程的其余内容,请升级到 CoddyKit PRO。 React Academy 课程共包含 4 节课。
「useSWR 钩子:获取、加载与错误状态」这节课中我会学到什么?
将 useSWR 与自定义获取函数结合使用,以声明式方式处理加载、错误和成功状态 你通过在浏览器中直接运行的动手代码来练习 React Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 React Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 React Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「useSWR 钩子:获取、加载与错误状态」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 React Academy 课中编写并运行代码吗?
能。每节 React Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- SWR 核心概念:过期即重新验证
- useSWR 钩子:获取、加载与错误状态
- 使用 SWR 进行变更与乐观更新
- SWR 与 React Query:选择合适的工具