Redux 中使用 Immutable.js 的注意事项

阅读时长 5 分钟读完

在 React 开发中,Redux 和 Immutable.js 都是非常常见的技术。Redux 是一个状态管理库,而 Immutable.js 则是一个用于创建不可变数据结构的 JavaScript 库。它们在一起可以帮助我们更准确、更高效地管理状态数据,避免难以追踪的副作用和深层次的状态嵌套。在 Redux 应用中使用 Immutable.js 虽然不难,但有些注意事项需要特别留意。

使用 Immutable.fromJS()

在 Redux 中,通常我们会使用 Immutable.js 的 fromJS() 方法将普通对象转化为 Immutable 对象。例如:

但是需要注意的是,使用 fromJS() 时,它会将数组和对象都转化为 Immutable 对象,这可能与你的预期不一致。例如:

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

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

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

可以看到,在转化后的 Immutable 对象中,friends 属性被转化为了一个 List 对象。如果你想要使用数组而非 List,则需要在转化时指定使用 fromJS 而不是 Map/List:

这里我们用一个可选的转换函数解决了问题,它会仅仅将原对象中的数组转化为数组,而对象仍然为 Map 对象。

避免使用 merge()

Immutable.js 中有一个 merge() 方法,可将两个 MapRecord 结构深度合并成一个新的结构:

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

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

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

但是在 Redux 中我们不应该使用 merge(), 因为它创建了一个新的结构,这将导致在许多情况下无法使用使用 shouldComponentUpdate()PureComponent 进行性能优化。

取而代之的是,我们可以使用 set() 方法和展开运算符 ... 来实现一个简单的更新:

或使用 ES6 中的对象展开运算符:

这样,我们只是将新的属性替换了原来的属性,而非创建一个新的对象。

DeepEqual() 中的注意事项

在 Redux 中,比较两个状态是合并之前和之后的状态的一个重要功能。由于 Immutable.js 的 MapList 数据结构不是 JavaScript 原生的对象,因此我们不能使用 === 运算符进行深度比较。此外,由于 Map 的属性顺序不影响其值,因此顺序也必须得到考虑。为了解决这个问题,Immutable.js 提供了 is()equals() 方法,它们可以深度比较 Immutable 对象和 Immutable 集合。

当使用 connect 函数和 mapStateToProps() 时,Redux 中应该使用 is() 方法来代替 === 进行比较。例如:

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

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

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

总结

在 Redux 应用中,我们经常使用 Immutable.js 作为状态管理的工具。在使用 Immutable.js 时,有三个主要注意事项:

  1. 使用 fromJS() 时要注意数组的转换;
  2. 避免使用 merge(),改为使用 set() 或对象展开运算符;
  3. 在连接到 Redux 中时,使用 is()equals() 方法进行深度比较。

希望本文能够对你在 Redux 开发过程中使用 Immutable.js 有所帮助。

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

纠错
反馈