使用Immutable.js从memoized选择器返回普通的JS对象

时间:2018-05-10 21:05:32

标签: javascript reactjs redux immutable.js reselect

我正在研究React + redux + Immutable.js +重新选择应用程序。我正在考虑一个设计,我在减速器和传奇中使用Immutable.js,但不想将这个库与智能组件耦合,所以我的应用程序的表现部分尽可能干净。

根据redux文档your selectors should always return Immutable object

我的想法是在重选选择器中计算派生状态并返回普通JS对象。如果我使用memoized选择器,如果reducex状态的部分内容相同,则不会在每次调用时创建新对象,因此除非需要,否则我的组件不会被重新呈现。

我知道我将部分支付可组合性,因为选择器不能用作其他Immutable.js就绪选择器的输入,但我会得到更清晰的智能组件。

这种解决方案有任何其他缺点吗?

为什么redux文档如此强烈地鼓励将Immutable对象推送到智能组件?

2 个答案:

答案 0 :(得分:2)

  

这种解决方案还有其他缺点吗?

toJS是昂贵的操作,即使已记住。论据是为什么toJS如果不需要的话?

  

为什么redux文档如此强烈地鼓励将不可变对象推向智能组件?

上述内容,加上它使得整个redux管道的推理更加容易,即,陈述的任何突变(副作用/同态)都更容易引起人们的注意,因为存在清晰的流程和发生变化的地方。

话虽这么说,但它归结为偏好,是人们感觉到架构中的瓶颈/权衡的地方。如果在选择器中使用toJS可以使分离清晰,胜过潜在的风险/隐患,那么这是对您的体系结构的正确选择。

关于选择器失去可组合性的侧面说明,您总是可以有两个选择器,一个返回不可变状态(用于选择器组合),另一个使用不可变状态选择器并调用toJS ,如果合适的话。

答案 1 :(得分:0)

  

这种解决方案还有其他缺点吗?

toJS昂贵,并且调试应用程序也变得更加复杂。

  

为什么redux文档如此强烈地鼓励将不可变对象推向智能组件?

  1. 不可变对象的验证比普通对象更深入。在进行oldObject === newObject验证的情况下,将在全局级别比较普通对象,而对oldImmutableObject === newImmutableObject进行比较则更深入。这在渲染树上更加有效,避免了在渲染React组件时不必要的更新。

  2. 易于使用助手功能修改对象。 getset等。

  3. 避免了不必要的数据复制。