【发布时间】:2017-09-22 18:30:42
【问题描述】:
在 redux 中,我知道状态是不可变的,当您创建新状态时,您实际上是在使用现有的新信息更新对象,然后完全重写状态。
今天我有一个想法,我不确定它有多愚蠢。
不断重写状态的计算成本高吗?我知道这是 Redux 的主要范例之一,但我想知道从内存和空间的角度来看这是否有意义。
【问题讨论】:
标签: reactjs redux react-redux immutability immutable.js
在 redux 中,我知道状态是不可变的,当您创建新状态时,您实际上是在使用现有的新信息更新对象,然后完全重写状态。
今天我有一个想法,我不确定它有多愚蠢。
不断重写状态的计算成本高吗?我知道这是 Redux 的主要范例之一,但我想知道从内存和空间的角度来看这是否有意义。
【问题讨论】:
标签: reactjs redux react-redux immutability immutable.js
你可以在 Redux 中改变状态,但你不应该不惜一切代价这样做,因为你会在 Redux anti-patterns 中编码
在原生 JavaScript 或任何框架中变异对象可能会带来许多副作用,调试起来可能会非常痛苦。你应该选择pure functions,除非它需要变异。
现在回到 Redux,reducer 中的函数应该是纯函数。原因如下:
Redux algorithm 通过比较前一个和下一个状态的内存位置来检查一个状态是否已更新。
现在,当您在 JavaScript 中更改对象时,您只是在更新现有对象,因此,内存位置保持不变并且存储不会更新。改变状态还会禁用Redux devtools 的一个基本功能,即通过时间旅行进行调试。
另一方面,如果不是改变对象而是创建一个新对象,当 redux 比较 previousState(更改之前的状态)和 nextState(您发送的新状态)的内存位置时,Redux 在这一点意识到发生了变化,它会用你的最新状态更新商店。
参考资料:
Redux 反模式: https://github.com/coodoo/react-redux-isomorphic-example/issues/9
Redux 开发工具的不纯函数和问题:
https://github.com/coodoo/react-redux-isomorphic-example/commit/6998c46d3c1a102b5f1bfb4f9aa44e5e7f9f6e87#commitcomment-12457617
为什么 Redux 需要 reducer 成为“纯函数”
https://medium.freecodecamp.org/why-redux-needs-reducers-to-be-pure-functions-d438c58ae468
Redux 开发工具:https://github.com/gaearon/redux-devtools
【讨论】: