store
有一个名为getState
的方法,它将返回商店的当前状态。
什么阻止我的应用程序中的代码(意外地)从state
修改返回的store
?
让我说我称之为:
let state = store.getState();
state.someProperty = 'fun';
我在getState
对象store
上找到的实现只返回被每个新动作覆盖的内部状态对象。
const getState = () => state;
在操作/新状态之间是什么阻止代码修改将被另一个订阅者读取的状态?在上面的示例中,将someProperty
设置为'fun'
将保留在store
属性的state
内,直到被覆盖。
虽然我显然不应该修改状态,但是一个简单的错误可能会将状态绑定到(不知不觉)修改其输入的某个组件 - 可能是在角度环境中的双向绑定?
<app-some-component [user]="state"></app-some-component>
不应将getState()
实施为其state
模型的克隆吗?
P.S。这与Angular没有特别关系 - 这就是我没有添加标签的原因 - 允许更多不习惯Angular的人回答这个问题。
答案 0 :(得分:1)
答案是:没有:)
核心Redux库本身在技术上并不关心状态是否发生变异。您实际上可以在您的Reducer中进行变异,或者让应用程序的其他部分获取状态树并对其进行变异,而商店本身也不会知道或不关心。
然而,突变会打破时间旅行调试,并使测试不可靠。更重要的是,React-Redux库假定您将不可变地处理您的状态,并依赖浅层相等比较来查看状态是否已更改。 (这就是"Why isn't my component re-rendering?"在Redux常见问题中的原因。99.9%的时间,这是由于意外突变造成的。)
如果您担心变异,可以使用像Immutable.js这样的库而不是普通的JS对象,或者使用freezing your state in development to catch mutations的几个工具之一。