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

Normy乐观更新实战:用optimisticData与rollbackData实现UI即时响应和自动回滚

Normy乐观更新实战:用optimisticData与rollbackData实现UI即时响应和自动回滚

【免费下载链接】normyAutomatic normalization and data updates for data fetching libraries (react-query, vue-query, trpc, swr, rtk-query and more)项目地址: https://gitcode.com/gh_mirrors/no/normy

Normy 是一个面向数据获取库(react-query、swr、rtk-query、trpc 等)的数据自动归一化库。本文聚焦它的实战利器——乐观更新(Optimistic Update):通过optimisticDatarollbackData两个选项,让 UI 在请求发出瞬间立即响应,失败时又自动回滚到原数据,全程无需手写缓存更新代码。

为什么需要乐观更新?

想象一个"改书名"的按钮:

  • 普通更新:用户点击 → 等待服务器响应 → UI 才变化。网络慢时体验生硬;
  • 乐观更新:用户点击 → UI立刻变成新值 → 后台请求成功则维持,失败则回滚。

手动实现乐观更新很繁琐:你要手动mutate每一个包含该数据的查询,还要在失败时记得把每个查询都还原。查询一多,代码又长又容易漏。这正是 Normy 解决的痛点。

原理:一次乐观数据,更新所有相关查询 ⚡

Normy 会把你应用里的查询数据按id自动归一化存储。当一次变更发生,它只需知道哪个 id 的哪个字段变了,就能自动找出所有引用了该对象的查询并同步更新。

optimisticData就是"提前告诉 Normy 即将发生的变化":

  1. 请求发出前,Normy 用optimisticData更新归一化数据,所有相关查询的 UI 立即刷新;
  2. 请求成功后,服务端真实响应再走一次标准归一化流程,UI 与服务器保持一致;
  3. 请求失败后,rollbackData生效,UI 自动恢复原状。

SWR 集成:一个完整示例

先安装并挂载 Provider(详见 packages/normy-swr/README.md):

npm install @normy/swr
const updateBookNameMutation = useNormalizedSWRMutation( 'mutation-key', async () => Promise.resolve({ id: '1', name: 'Name updated' }), { // 请求前:UI 立刻显示新名字 optimisticData: { id: '1', name: 'Name updated' }, // 失败时:自动恢复旧名字 rollbackData: { id: '1', name: 'Name' }, }, );

就这么几行,所有包含id: 1这本书的查询(列表页、详情页……)都会瞬间更新。核心实现逻辑在 useNormalizedSWRMutation.ts:请求发起时触发乐观更新,onError时触发回滚。

react-query 集成:放进 onMutate 的 context 🔁

react-query 官方支持在onMutate返回 context,Normy 会订阅 MutationCache 自动读取:

useMutation({ mutationFn: async () => ({ id: '1', name: 'Name 1 Updated' }), onMutate: () => ({ optimisticData: { id: '1', name: 'Name 1 Updated' }, rollbackData: { id: '1', name: 'Name 1' }, }), });

pending 状态触发乐观更新、error 状态触发回滚的监听代码位于 create-query-normalizer.ts,完整文档见 packages/normy-react-query/README.md。

实战技巧清单 💡

  1. rollbackData要存"改之前"的值:从当前查询数据中取出旧值传入,回滚才准确;
  2. 可加normalize: false避免重复工作:如果你确定响应结构与optimisticData一致,可以在 mutation 上设置normalize: false,成功后不再重复归一化一次(两个集成的文档都有示例);
  3. 嵌套对象同样有效optimisticData里的嵌套对象(如author: { id, name })也会按 id 归一化,一次更新联动多处;
  4. 顶层数组仍需手动处理:往列表头部/尾部"插入"或"删除"元素这类结构变化,Normy 无法判断插入位置,仍需手动更新——这与它的定位一致,只自动化"按 id 的内容变更"。

动手体验:跑一个官方示例 🚀

仓库内置了四种集成的可运行示例,其中 SWR 示例演示了带 3 秒延迟的乐观改名 + 回滚:

git clone https://gitcode.com/gh_mirrors/no/normy

关键文件:

  • SWR 乐观更新示例:examples/swr/src/components/app.jsx
  • react-query 乐观更新示例:examples/react-query/src/components/app.jsx
  • tRPC 乐观更新示例:examples/trpc/src/components/app.tsx

小结

选项触发时机作用
optimisticData请求发出瞬间UI 立即呈现"预期结果"
服务端响应请求成功按真实数据自动校正所有查询
rollbackData请求失败自动回滚到原数据

用 Normy,"即时响应 + 自动回滚"从几十个缓存操作的手工活,变成两行配置——这就是数据归一化带来的红利。

【免费下载链接】normyAutomatic normalization and data updates for data fetching libraries (react-query, vue-query, trpc, swr, rtk-query and more)项目地址: https://gitcode.com/gh_mirrors/no/normy

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

http://www.cnnetsun.cn/news/4158690.html

相关文章:

  • 像素级渲染生成色彩图:Colorful ColorMapView颜色轮实现原理深度解析
  • 零依赖的传奇:10年仍流畅运行的纯JS复古贪吃蛇游戏——JavaScript-Snake 项目全览
  • MMAS Money Tracker 支出分析指南:用饼图一眼看穿你的钱花在了哪里
  • Megatron-LLM快速上手:手把手微调LLaMa 2 7B的完整实战教程(含500M tokens代码数据)
  • pg_pathman内置监控视图清单:pathman_partition_list等4大视图一键掌握分区状态
  • Lightbeam的心脏:一个HTTP请求如何从Firefox事件捕获变成图谱上的一个节点
  • 为什么 QMedia 的多模态 RAG 问答更聪明?图文短视频内容检索与智能问答使用详解
  • 一行use解决:Hammox.Protect宏如何让Elixir测试模块自带契约检查
  • heroku_san安装教程:Rails 3+、Rails 2与Sinatra三种框架如何快速接入Heroku部署
  • PyMacroRecord:免费跨平台宏录制工具,重复操作一键回放
  • 深入 Duster 架构:基于 Laravel Zero 与适配器模式统一 4 大 Lint 工具的设计之道
  • CoopCycle餐厅配置实战:5步搞定菜单、商品与在线点餐的完整教程
  • HDR环境光照教程:用intensity_env和rotate_env在rayshader_portraits中打造电影级光影
  • 基于FMMosaicLayout打造互动图片墙:Cell长按缩放动画与复用机制实战
  • tlock进阶技巧:Duration、轮次编号与Armor,6个让时间锁加密更灵活的用法
  • 题解:洛谷 P3076 [USACO13FEB] Taxi G
  • NCM 转 MP3 完整攻略:用 ncmdump 免费转换,拖拽 4 步上手
  • FiD显存优化秘籍:Checkpointing与answer_maxlength如何驯服100段长文本
  • 毕业论文“难产”自救指南:AI写论文哪个软件最好?我站宏智树AI
  • UE5-MCP:如何用AI把3个月的UE5关卡开发压缩到3天
  • 星际争霸II Bot API库python-sc2入门:为什么它是Python打造SC2 AI机器人的终极选择
  • 为什么Remote PowerShell正在被淘汰:理解Exchange V3模块的REST API连接迁移(office-docs-powershell)
  • 053、VLA模型的训练数据与配比:互联网数据与机器人数据的融合
  • 3步备份QQ空间全部历史说说:GetQzonehistory 完整上手指南
  • QuickLook 插件选型指南:macOS 空格键预览只装这几组才真正用得上
  • PCSX2 Gamefixes与PNACH作弊码完全指南:解决闪退卡顿并解锁60帧
  • Engauge Digitizer 入门指南:从图表图像提取数据点的安装配置全流程
  • CSWin Transformer预训练权重怎么选:Tiny/Small/Base/Large六种模型参数与FLOPs全对比(附选型建议)
  • 如何快速给 Unity WebGL 加上原生输入框:WebGLInput 完整上手指南
  • Oracle APEX Blueprints实战:AI驱动的规范开发,从需求文档一键生成应用