store
有一个名为getState
的方法,它将返回商店的当前状态。防止代码更改商店状态的原因是什么?
什么防止代码在我的应用程序的某处(意外)从store
修改返回的state
?
比方说,我称之为:
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的人来回答这个问题。
你是说我需要有一个不可变的模型(来自immutable.js之类的),或者我需要在测试/开发时冻结我的状态,但不冻结生产? –
正如我所说的,Redux本身并没有什么能够强化不可变性。即使您仔细编写Reducer代码或使用不可变更新实用程序库,技术上,代码的任何部分都可以调用getState并修改内容。如果你想保证不会发生,你需要使用除了普通JS对象以外的东西,或者冻结普通对象以确保代码不会在任何地方发生变异。也就是说,应用程序的其余部分当然不应该在任何地方改变状态,但它有时会偶然发生。 – markerikson
只是不禁想到这是不好的 - 很容易发生意外 - 猜测自动化测试将比以往更重要... –