React Query 管理突变

date
Nov 5, 2025
slug
react-query-managing-mutations
status
Published
tags
React Query
summary
让你的数据更新像"同步"一样丝滑
type
Post
小伙伴们好!今天咱们聊聊数据更新——不是查询数据,而是改变数据。这就像看电影和拍电影的区别!

开篇:读和写的本质区别

先看看 React 的 useState
客户端状态更新很简单——你说了算,立即生效。
但服务器状态呢?

为什么不能用 useQuery 做更新?

你可能会想:
问题大了:
  1. 组件一挂载就执行:用户还没点按钮呢!
  1. 会自动重复执行:窗口获得焦点就重新更新?
  1. 不是幂等的:查询执行100次结果一样,更新执行100次... 💀
这就像:
  • 查询 = 看菜单(看100次也没事)
  • 更新 = 点菜(点100次要破产)

useMutation:专门处理更新的钩子

useMutation 就是为更新而生的:
关键区别:
  • useQuery:自动执行
  • useMutation:手动触发

生命周期管理:不只是发请求

useMutation 真正的价值在于管理更新的生命周期:
状态流转:
  • idle:待命中
  • pending:执行中
  • success:成功了
  • error:失败了

生命周期钩子:在关键时刻做事

方式一:在 mutate 时传入

方式二:在 useMutation 中配置

突变与查询的协作:更新缓存

更新成功后,如何让 UI 立即显示新数据?

方案一:手动更新缓存

这就像:改了名字后,直接在身份证上涂改(快但危险)。

如果 API 不返回完整数据?

⚠️ 重要:必须返回新对象!

复杂场景:多个缓存条目

想象一个待办事项应用,有不同的排序方式:
添加新待办事项后,要更新所有列表?

笨方法:逐个更新

问题:
  • 代码重复
  • 容易出错
  • 客户端排序逻辑可能与服务器不一致

聪明方法:缓存失效

这就像:改了菜单后,让所有人重新拿一份(准确但稍慢)。

模糊匹配:一石多鸟

invalidateQueries 的强大之处在于模糊匹配:

查询键的层次结构

从通用到具体:
这就像文件系统:

高级失效技巧

只失效过期的查询

只失效活跃的查询

自定义过滤

最佳实践对比

方案
适用场景
优点
缺点
手动更新
单个缓存条目
即时生效
逻辑复杂
缓存失效
多个缓存条目
数据准确
需要重新请求
混合方案
关键数据
平衡速度和准确性
代码较多

混合方案示例

TypeScript 小贴士

总结

useMutation 让数据更新变得优雅:
  1. 生命周期管理:从 pending 到 success/error
  1. 手动触发:完全控制何时更新
  1. 缓存同步:
      • 简单场景:手动更新
      • 复杂场景:缓存失效
  1. 模糊匹配:一次失效多个查询
  1. 层次化键:组织良好的缓存结构
记住:
  • 查询 = 看菜单(随便看)
  • 突变 = 改菜单(谨慎改)
  • 缓存失效 = 重新打印菜单(确保最新)
选择合适的策略,让你的数据更新既快速又准确!

© 拾光 2025 - 2026

粤ICP备2025472574号