我正在研究React + redux + Immutable.js +重新选择应用程序。我正在考虑一个设计,我在减速器和传奇中使用Immutable.js,但不想将这个库与智能组件耦合,所以我的应用程序的表现部分尽可能干净。
根据redux文档your selectors should always return Immutable object。
我的想法是在重选选择器中计算派生状态并返回普通JS对象。如果我使用memoized选择器,如果reducex状态的部分内容相同,则不会在每次调用时创建新对象,因此除非需要,否则我的组件不会被重新呈现。
我知道我将部分支付可组合性,因为选择器不能用作其他Immutable.js就绪选择器的输入,但我会得到更清晰的智能组件。
这种解决方案有任何其他缺点吗?
为什么redux文档如此强烈地鼓励将Immutable对象推送到智能组件?
答案 0 :(得分:2)
这种解决方案还有其他缺点吗?
toJS
是昂贵的操作,即使已记住。论据是为什么toJS
如果不需要的话?
为什么redux文档如此强烈地鼓励将不可变对象推向智能组件?
上述内容,加上它使得整个redux管道的推理更加容易,即,陈述的任何突变(副作用/同态)都更容易引起人们的注意,因为存在清晰的流程和发生变化的地方。
话虽这么说,但它归结为偏好,是人们感觉到架构中的瓶颈/权衡的地方。如果在选择器中使用toJS
可以使分离清晰,胜过潜在的风险/隐患,那么这是对您的体系结构的正确选择。
关于选择器失去可组合性的侧面说明,您总是可以有两个选择器,一个返回不可变状态(用于选择器组合),另一个使用不可变状态选择器并调用toJS
,如果合适的话。
答案 1 :(得分:0)
这种解决方案还有其他缺点吗?
toJS
昂贵,并且调试应用程序也变得更加复杂。
为什么redux文档如此强烈地鼓励将不可变对象推向智能组件?
不可变对象的验证比普通对象更深入。在进行oldObject === newObject
验证的情况下,将在全局级别比较普通对象,而对oldImmutableObject === newImmutableObject
进行比较则更深入。这在渲染树上更加有效,避免了在渲染React组件时不必要的更新。
易于使用助手功能修改对象。 get
,set
等。
避免了不必要的数据复制。