store
具有一种称为getState
的方法,该方法将返回商店的当前状态。
是什么阻止了我的应用程序中某个地方的代码(偶然地)从store
修改返回的state
?
假设我称之为:
let state = store.getState();
state.someProperty = 'fun';
我在store
对象上在getState
上找到的实现,只需返回每个新操作被覆盖的内部状态对象。
const getState = () => state;
在动作/新状态之间,什么阻止代码修改另一个订户将读取的状态?在我的上面示例中,将someProperty
设置为'fun'
将在state
属性的store
内持续存在,直到覆盖为止。
虽然我显然不应该修改状态,但一个简单的错误可能会将状态绑定到某种(在不知不觉中)修改其输入的组件 - 也许在角度环境中的2路绑定上?
<app-some-component [user]="state"></app-some-component>
不应该将getState()
作为其state
模型的克隆实现吗?
P.S。这与Angular无关 - 这就是为什么我没有添加标签 - 允许更多的人不用朝角来回答问题。
答案是: nothing :)
从技术上讲,核心Redux库本身并不在乎状态是否被突变。实际上,您可以在还原器中突变,或者让应用程序的其他部分获取状态树并将其变异,并且商店本身不会知道或关心。
然而,突变会打破时间到达调试,并使测试不可靠。更重要的是,React-Redux库假定您将不成熟地处理您的状态,并依靠浅层平等比较来查看状态是否发生了变化。(这就是为什么"为什么我的组件不重新渲染?"的原因是Redux常见问题解答99.9%,这是由于意外突变所致。)
如果您担心突变,则可以使用诸如Immutable.js的库代替普通JS对象,或者使用几种工具之一将您的状态冻结在开发中捕获突变。