我用“正常”方式构建了我的第一个具有有状态存储的React应用程序,现在我正在研究使用Este starterkit中使用的不可变全局状态。
它以几种方式简化了应用程序结构:
我只读了关于在React中使用不可变数据的积极的事情,建议避免组件中的状态,所以我想知道是否有任何缺点。我认为必须有,否则我不明白为什么不推荐它作为构建React应用程序的 方式。
不变性对我来说是新的,如果我开始在复杂的真实应用程序中使用这种方法,我是否应该注意一些警告?
我能想到的唯一一件小事是在Este使用它时使用forceUpdate(),因为我读过它是一个同步函数。例如,Morearty似乎将更新推迟到下一个动画帧以便批量处理它们,但我认为这是一个实现细节/优化,而不是一些继承的不可变单态方法的缺点。
答案 0 :(得分:13)
this.state.getIn("[parent, child, index]")
因为它增加了模型更改破坏组件代码的可能性。这可以通过可扩展性(更多关于下面的内容)或通过帮助方法来预防,但是你肯定会失去普通JS成员的简单性。答案 1 :(得分:6)
通过道具传递数据的一个优点是,您可以利用shouldComponentUpdate
进行更高效的更新。如果您假设数据始终来自父级(例如通过道具),则可以有效地防止组件树的大部分必须重新渲染。不可变值使得这非常好,因为您可以在组件层次结构中相对较高的shouldComponentUpdate
中引用相等性检查。
我在使用React使用不可变数据时发现的唯一另一个缺点是React开发人员工具不能很好地与它们一起工作(它们向您显示不可变值的底层数据结构而不是JS友好值)
答案 2 :(得分:3)
我知道答案已被接受,但我发现主要的缺点是你将非纯JavaScript对象传递给组件代码,这意味着你在从Immutable中读取值时不能使用常规JavaScript property accessors通过props
传入的对象。相反,你必须use Immutable.js' read API。这是一个重要的权衡。你不能在商店里继续使用它所包含的Immutable.js;它现在已经在整个应用程序中泄漏了。当 Immutable.js被具有它自己的API或能够使用本机属性访问器的下一个buzzy Immutability库替换时,这可能是您感觉到的痛苦。此外,第三方代码几乎肯定会期望普通的旧JavaScript对象,因此在传递它们之前需要转换它们。如果您计划将Immutable.js引入现有应用程序,那么在组件代码中很快就会变得不清楚props
是不可变的,哪些是JS对象,除非您非常自律并提出命名方案或在渲染链中传递对象时,您可以使用的其他一些方法。