0Pricing
React Academy · 课时

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 反馈 — 无需本地设置。

此课程中的所有课时

  1. SWR 核心概念:过期即重新验证
  2. useSWR 钩子:获取、加载与错误状态
  3. 使用 SWR 进行变更与乐观更新
  4. SWR 与 React Query:选择合适的工具
← 返回 React Academy