菜单

immer 中间件

相关源文件

Zustand 中的 immer 中间件使开发人员能够使用“可变”风格编写更简单、更直观的状态更新,同时在底层保持不变性。您无需手动创建嵌套对象的副本以不变的方式更新它们,而是可以直接修改 immer 将其转换为不变更新的草稿状态对象。

本文档专门介绍 immer 中间件。有关 persist 或 devtools 等其他中间件选项的信息,请参阅 中间件系统 部分中的相应页面。

immer 中间件的工作原理

immer 中间件由 Immer 库提供支持,该库允许您编写看似“修改”状态的代码,但实际上会生成不变的更新。这种方法在处理状态中复杂的嵌套对象时特别有用。

来源:docs/middlewares/immer.md9-49

与 Zustand 架构集成

immer 中间件通过包装状态创建者函数并增强 set 函数以支持“草稿”状态对象,从而融入 Zustand 的中间件系统。

来源:docs/middlewares/immer.md20-49

API 参考

immer 中间件接受一个状态创建者函数,并返回一个增强的状态创建者函数,该函数支持基于草稿的状态更新。

签名

参数

  • stateCreatorFn:一个定义您的 store 的初始状态和操作的函数。它接收标准的 setgetstore 参数。

返回值

  • 一个新的状态创建者函数,可实现 immer 支持的不变更新。

来源:docs/middlewares/immer.md25-49

使用 immer 中间件

基本用法

要使用 immer 中间件,请将您的状态创建者函数与 immer 函数包装起来。

有了这个设置,您现在可以在操作中执行“可变”更新,这些更新实际上会产生不变的状态更改。

来源:docs/middlewares/immer.md52-231

有和没有 immer 的状态更新

传统的不变更新(没有 immer)

没有 immer,更新嵌套对象需要在每一层都创建副本。

简化更新(使用 immer)

使用 immer,您可以直接“修改”草稿状态。

可变风格更简洁,不易出错,尤其是在处理深度嵌套的对象时。

来源:docs/middlewares/immer.md52-231

实际示例

让我们来看一个使用 immer 管理表单状态的实际示例。

没有 immer,更新表单字段需要在每次更新时展开现有的 person 对象。使用 immer,您可以直接修改草稿状态。

来源:docs/middlewares/immer.md156-230

TypeScript 集成

immer 中间件已与 TypeScript 完全类型化。中间件向状态创建者添加了一个特定的修改器。

这可确保在使用带有草稿状态的增强型 set 函数时获得正确的类型推断。

来源:docs/middlewares/immer.md30-36

优点和用例

immer 中间件在以下情况特别有益:

  1. 处理深度嵌套的状态对象
  2. 管理复杂的数据结构(对象数组等)
  3. 希望简化更新逻辑以提高可读性
  4. 降低意外修改状态的风险

它消除了在创建对象副本时进行 {...state} 等样板代码的需要,使您的代码更简洁、更不易出错。

来源:docs/middlewares/immer.md9-14 docs/middlewares/immer.md52-231

实现细节

在内部,immer 中间件使用 Immer 的 produce 函数将“可变”操作转换为不变更新。它包装了提供给您的状态创建者的 set 函数,以通过此过程拦截和转换状态更新。

当您使用修改草稿状态的函数调用 set 时,中间件会:

  1. 创建当前状态的草稿版本
  2. 将草稿传递给您的更新函数
  3. 允许您对草稿进行“修改”
  4. 使用 Immer 将这些修改转换为正确的不可变更新
  5. 将生成的状态更改应用于 store。

这一切都透明地发生,使您能够编写更简单的代码,同时保持不变性。

来源:docs/middlewares/immer.md9-49

结论

immer 中间件显著简化了 Zustand 中的状态更新,特别是对于复杂或嵌套的状态。通过利用 Immer 强大的“草稿状态”概念,它允许您编写更直观的代码,而无需牺牲不变性。这使得应用程序更易于维护,并减少了与意外状态修改相关的错误。