是什么阻止代码改变商店状态?

What prevents code from changing the store state?

store 有一个名为 getState 的方法,它将 return 商店的当前状态。

是什么阻止我的应用程序中某处的代码(意外地)修改 store 中的 returned state

假设我这样称呼:

let state = store.getState();
state.someProperty = 'fun';

我在 getState 上的 store 对象上找到的实现只是 return 被每个新操作覆盖的内部状态对象。

const getState = () => state;

在 actions/new 状态之间是什么阻止代码修改将由另一个订阅者读取的状态?在我上面的示例中,将 someProperty 设置为 'fun' 将在 state 属性 上的 store 内持续存在,直到被覆盖。

虽然我显然不应该修改状态,但一个简单的错误可能会将状态绑定到某个组件(在不知不觉中)修改其输入 - 可能在 angular 环境中的双向绑定?

<app-some-component [user]="state"></app-some-component>

不应该 getState() 作为其 state 模型的克隆来实现吗?

P.S。这与 Angular 没有特别相关 - 这就是为什么我没有添加标签 - 让更多不习惯 Angular 的人回答问题。

答案是:没有 :)

核心 Redux 库本身在技术上并不关心状态是否发生变化。你实际上可以在你的减速器中发生变异,或者让你的应用程序的其他部分获取状态树并对其进行变异,而商店本身不会知道或关心。

但是,突变会破坏 time-travel 调试,并使测试不可靠。更重要的是,React-Redux 库假定您 不可变地处理您的状态,并依靠浅层相等比较来查看状态是否已更改。 (这就是为什么 "Why isn't my component re-rendering?" 在 Redux 常见问题解答中的原因。99.9% 的时间,这是由于意外突变。)

如果您担心变异,您可以使用像 Immutable.js 这样的库来代替普通的 JS 对象,或者使用 freezing your state in development to catch mutations.

的几个工具之一