当前位置: 首页 > web >正文

【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。

🔧 核心能力对比

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

🧪 示例对比

✅ SWR 示例

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 示例

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

🧩 总结

特点SWRReact Query
关键词简洁、极致缓存、自动更新全能、丰富配置、请求控制强大
适合人群追求极简代码的开发者构建复杂数据流、可控性的项目
http://www.xdnf.cn/news/13693.html

相关文章:

  • 力扣HOT100之技巧:169. 多数元素
  • 【Zephyr 系列 21】OTA 升级与产测系统集成:远程配置、版本验证、自动回滚机制设计
  • 请问黑盒测试和白盒测试有哪些方法?
  • 力扣-198.打家劫舍
  • leetcode HOT100(49.字母异位词分组)
  • 怎样解决在ubuntu 22.04上QT: DataVisualization控件显示黑屏的问题
  • 触觉智能RK3576核心板工业应用之软硬件全国产化,成功适配开源鸿蒙OpenHarmony5.0
  • LangGraph--带记忆和工具的聊天机器人
  • Modbus TCP转DeviceNet网关连接ABB变频器配置案例
  • 破解关键领域软件测试“三重难题”:安全、复杂性、保密性
  • 电脑、手机长时间不关机可以吗
  • Rabbitmq后台无法登录问题解决
  • Genio 1200 Evaluation MT8395平台安装ubuntu
  • 全栈监控系统架构
  • 22、话题重名及解决方案
  • 销售预测的方法与模型(二)丨商品与库存分类——基于数据模型运营的本质和底层逻辑销售
  • Spring MVC 入门案例:从代码到原理的深度剖析
  • Docker 构建文件代码说明文档
  • qemu-kvm+virt-manager创建虚拟机设置桥接模式
  • 告别手动做PPT!4款AI工具实现自动化生成
  • Python—turtle绘图库使用方法
  • 【论文阅读笔记】高光反射实时渲染新突破:3D Gaussian Splatting with Deferred Reflection 技术解析
  • 技术专栏|LLaMA家族——模型架构
  • 算法学习笔记:2.大根堆算法——数据流的中位数​​or最后一块石头的重量
  • 【Redisson】锁可重入原理
  • Redis初识第一期
  • 从0到1构建高并发秒杀系统:实战 RocketMQ 异步削峰与Redis预减库存
  • 接口测试常用工具及测试方法(基础篇)
  • 【MySQL】视图
  • 电话号码的字母组合