Redux 中使用 ImmutableJS 时的坑

阅读时长 4 分钟读完

前言

在前端应用中,状态管理是非常重要的一环,而 Redux 作为目前比较流行的状态管理库,其强大的可预测性和可维护性受到了广泛的认可。而使用 ImmutableJS 结合 Redux 可以更好地实现不可变状态,提高性能和减少 bug,但也存在一些坑点需要注意,接下来就来具体分析。

ImmutableJS 简介

ImmutableJS(以下简称 Immutable)是一种 JavaScript 库,提供了一个不可变的数据结构,使数据的修改和传递变得更加高效和可预测。Immutable 主要提供了以下数据结构:

  • List:有序的可重复的值的集合
  • Map:有序的键值对的集合
  • Set:无序的唯一的值的集合
  • Record:Map 的特化版本,限定了可接受的键和默认值
  • OrderedMap、OrderedSet、Stack 等

Immutable 数据结构是不可变的,表示一份数据的不同版本,可通过复制原始值然后修改新值的方式来创建,而原来的值不会发生变化。这种不可变性使得在实现复杂应用程序时,能够更好地保持程序的状态可维护性和可扩展性。

Redux 中使用 Immutable 的好处

在 Redux 中,state 是不可变的,每个 action 都会创建一个新的 state,而不是在原有的 state 上进行修改,这样保证了 state 记录的完整性和可追踪性。当我们使用 Immutable 来实现 state 时,可以更好地发挥这个机制,以下是一些优点:

  1. 保证 state 的不可变性,避免意外的修改
  2. 避免了 performace overhead,因为 React 可以顺利的确定哪些部分的数据发生了变化从而更新
  3. 操作链的优化,可以简化操作,因为 Immutable 对这种非常常见的需求提供了易于使用的 API
  4. 简化了 state 的深层嵌套,导致显式的转换

Redux 和 ImmutableJS 结合的问题

虽然结合使用 Redux 和 ImmutableJS 有利可图,但也存在一些需要注意的问题,主要集中在以下几点:

应用数据库查询的 API 不能直接使用

Redux 的 state 是一个 ImmutableJS 的数据结构,而 Redux 的 reducers 都是以一个普通的 JavaScript 对象作为入参。因此,在应用 Ajax 数据库API 时应该考虑如何将返回的 JSON 数据结构解压到 MongoDB 查询之前的状态中。

在 Redux 可以减少不必要的手势

ImmutableJS 在开发过程中可以很好地处理无意义的手势,比如两个类似的对象(只考虑内部数据),一个参照另一个生成。使用 ImmutableJS 可以保持代理对象的总和,而不是为两个相同的对象额外地保留另一个代理对象。

数据修改函数的返回值

使用的大部分 Redux Middleware 都是预想 action 发生状态变化时的操作,如果使用一个返回值 的函数作为数据修改函数,拦截到 action 时就不会发生任何变化。因此,返回一个自己定义的 failure action 可以更好的预处理错误。

性能问题(查看属性而不是整个结构,避免闭包)

由于 ImmutableJS 会按照不同的深度预处理不同的 key,所以在使用时建议尽可能避免查看大量的不同 key,尤其要检查是否需要查看整个 immutable 结构,或者只是其中的一些属性。避免使用不必要的闭包也是为了提高性能所必须注意的一点。

示例代码

下面是一个使用 ImmutableJS 和 Redux 的示例代码:

-- -------------------- ---- -------
------ - ---------------- ----------- - ---- --------
------ - --- - ---- ------------

----- ------------ - ----- ------ - ---

----- --------- - -- -- --
  ----- ------
---

----- ------------ - ------ - -- ------- -- -
  ------------------- -
    ---- ------
      ------ ----- - --
    --------
      ------ ------
  -
-

----- ---------- - ------------- ------ ------------ ---

----- ----------- - -----------------
  ------ -------------------
---

----- ----- - ------------------------ --------------

----------------------------

总结

ImmutableJS 和 Redux 结合可以为我们带来不可变状态的好处,保证了程序状态的可追踪性和可维护性。但是,同时也需要注意一些陷阱,比如处理查询 API、返回值的问题、性能问题等。希望这篇文章能够帮助你更好地使用 ImmutableJS 和 Redux。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64caf4e45ad90b6d041e1022

纠错
反馈