【React】SWR 和 React Query(TanStack Query)

它们都是目前非常流行的 React 生态中用于 服务端数据获取和缓存管理 的库。

客户端状态 vs 服务端状态

客户端状态(浏览器内存):

  1. UI 状态控制,表单输入、开关切换、弹窗显隐
  2. 主题偏好
  3. 未提交的用户数据

服务端状态(数据库异步获取):

  1. 客户端拥有的是其"快照"或者"缓存"

手动管理服务端状态的挑战:

  • 样板代码:useState(data,loading,error),useEffect(fetch)
  • 缓存管理:如何避免重复请求?数据何时过期?
  • 后台同步:数据在后台被修改了怎么办?
  • 乐观更新:提升用户体验,但实现复杂(先显示UI,再调用接口修改数据)
  • 分页与无限滚动:数据聚合与状态管理复杂
  • 竞争条件:多次快速请求导致的数据不一致
  • 焦点重新获取:窗口切换回来时数据是否需要刷新?

而使用 swr / tanstack query 可以很好的解决上述问题。


📦 一句话简介

简介
SWR 由 Vercel 团队开发,采用"缓存优先 + 数据同步"的策略,极简 API,适合 REST 接口场景。
React Query(TanStack Query) 功能更全面、灵活度更高的异步状态管理工具,适合中大型应用,支持 REST/GraphQL。

🔧 核心能力对比

能力 SWR React Query
数据缓存 ✅ 自动缓存、共享 ✅ 自动缓存、共享、时间控制更细
请求状态管理 ✅ 提供 isLoading, error 等状态 ✅ 更丰富,如 isFetching, isSuccess
自动重新验证(revalidate) ✅ 默认启用(焦点恢复、网络恢复) ✅ 可配置(焦点、窗口切换、间隔轮询)
Mutation 支持 ⚠️ 需要自己手写请求逻辑 ✅ 内建 useMutation
查询依赖(Query key) ⚠️ 依赖 key 手动拼接控制 ✅ Query Key 和依赖自动管理
类型推导(TS) ✅ 简单支持 ✅ 类型体系强大
DevTools ❌ 无官方工具 ✅ 有官方 DevTools
SSR 支持 ✅ 支持 ✅ 支持,且整合 Next.js 更完善
配置复杂度 ✅ 极简配置 ⚠️ 稍复杂,功能全面需要更多代码
状态持久化 ❌ 不支持 ✅ 支持(如 localStorage、hydration)

🧪 示例对比

✅ SWR 示例

tsx 复制代码
import useSWR from 'swr';
import axios from 'axios';

const fetcher = url => axios.get(url).then(res => res.data);

function Profile() {
  const { data, error, isLoading } = useSWR('/api/user', fetcher);

  if (isLoading) return <div>加载中...</div>;
  if (error) return <div>出错了</div>;

  return <div>用户名: {data.name}</div>;
}

✅ React Query 示例

tsx 复制代码
import { useQuery } from '@tanstack/react-query';
import axios from 'axios';

function Profile() {
  const { data, isLoading, error } = useQuery({
    queryKey: ['user'],
    queryFn: () => axios.get('/api/user').then(res => res.data),
  });

  if (isLoading) return <div>加载中...</div>;
  if (error) return <div>出错了</div>;

  return <div>用户名: {data.name}</div>;
}

🧠 使用建议(选型指南)

使用场景 推荐
小项目、Next.js 项目、只需 GET 请求 ✅ SWR
中大型项目、需要缓存策略控制、mutation、多状态 ✅ React Query
REST 或 GraphQL 请求管理统一、支持分页、懒加载等复杂逻辑 ✅ React Query
想用最少代码获取远程数据 ✅ SWR

🧩 总结

特点 SWR React Query
关键词 简洁、极致缓存、自动更新 全能、丰富配置、请求控制强大
适合人群 追求极简代码的开发者 构建复杂数据流、可控性的项目
相关推荐
翻滚吧键盘2 分钟前
vue绑定一个返回对象的计算属性
前端·javascript·vue.js
秃了也弱了。20 分钟前
Chrome谷歌浏览器插件ModHeader,修改请求头,开发神器
前端·chrome
乆夨(jiuze)41 分钟前
记录H5内嵌到flutter App的一个问题,引发后面使用fastClick,引发后面input输入框单击无效问题。。。
前端·javascript·vue.js
忧郁的蛋~1 小时前
HTML表格导出为Excel文件的实现方案
前端·html·excel
小彭努力中1 小时前
141.在 Vue 3 中使用 OpenLayers Link 交互:把地图中心点 / 缩放级别 / 旋转角度实时写进 URL,并同步解析显示
前端·javascript·vue.js·交互
然我1 小时前
别再只用 base64!HTML5 的 Blob 才是二进制处理的王者,面试常考
前端·面试·html
NanLing1 小时前
【纯前端推理】纯端侧 AI 对象检测:用浏览器就能跑的深度学习模型
前端
呆呆的心1 小时前
前端必学:从盒模型到定位,一篇搞定页面布局核心 🧩
前端·css
小飞悟1 小时前
前端高手才知道的秘密:Blob 居然这么强大!
前端·javascript·html
小old弟1 小时前
用Sass循环实现炫彩文字跑马灯效果
前端