Zustand 中的 immer 中间件使开发人员能够使用“可变”风格编写更简单、更直观的状态更新,同时在底层保持不变性。您无需手动创建嵌套对象的副本以不变的方式更新它们,而是可以直接修改 immer 将其转换为不变更新的草稿状态对象。
本文档专门介绍 immer 中间件。有关 persist 或 devtools 等其他中间件选项的信息,请参阅 中间件系统 部分中的相应页面。
immer 中间件由 Immer 库提供支持,该库允许您编写看似“修改”状态的代码,但实际上会生成不变的更新。这种方法在处理状态中复杂的嵌套对象时特别有用。
来源:docs/middlewares/immer.md9-49
immer 中间件通过包装状态创建者函数并增强 set 函数以支持“草稿”状态对象,从而融入 Zustand 的中间件系统。
来源:docs/middlewares/immer.md20-49
immer 中间件接受一个状态创建者函数,并返回一个增强的状态创建者函数,该函数支持基于草稿的状态更新。
stateCreatorFn:一个定义您的 store 的初始状态和操作的函数。它接收标准的 set、get 和 store 参数。来源:docs/middlewares/immer.md25-49
要使用 immer 中间件,请将您的状态创建者函数与 immer 函数包装起来。
有了这个设置,您现在可以在操作中执行“可变”更新,这些更新实际上会产生不变的状态更改。
来源:docs/middlewares/immer.md52-231
没有 immer,更新嵌套对象需要在每一层都创建副本。
使用 immer,您可以直接“修改”草稿状态。
可变风格更简洁,不易出错,尤其是在处理深度嵌套的对象时。
来源:docs/middlewares/immer.md52-231
让我们来看一个使用 immer 管理表单状态的实际示例。
没有 immer,更新表单字段需要在每次更新时展开现有的 person 对象。使用 immer,您可以直接修改草稿状态。
来源:docs/middlewares/immer.md156-230
immer 中间件已与 TypeScript 完全类型化。中间件向状态创建者添加了一个特定的修改器。
这可确保在使用带有草稿状态的增强型 set 函数时获得正确的类型推断。
来源:docs/middlewares/immer.md30-36
immer 中间件在以下情况特别有益:
它消除了在创建对象副本时进行 {...state} 等样板代码的需要,使您的代码更简洁、更不易出错。
来源:docs/middlewares/immer.md9-14 docs/middlewares/immer.md52-231
在内部,immer 中间件使用 Immer 的 produce 函数将“可变”操作转换为不变更新。它包装了提供给您的状态创建者的 set 函数,以通过此过程拦截和转换状态更新。
当您使用修改草稿状态的函数调用 set 时,中间件会:
这一切都透明地发生,使您能够编写更简单的代码,同时保持不变性。
来源:docs/middlewares/immer.md9-49
immer 中间件显著简化了 Zustand 中的状态更新,特别是对于复杂或嵌套的状态。通过利用 Immer 强大的“草稿状态”概念,它允许您编写更直观的代码,而无需牺牲不变性。这使得应用程序更易于维护,并减少了与意外状态修改相关的错误。