什么阻止代码更改存储状态?

时间:2017-02-16 13:44:16

标签: redux getstate

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的人回答这个问题。

1 个答案:

答案 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的几个工具之一。