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

Redux 是什么阻止代码更改存储状态?,redux,getstate,Redux,Getstate,store有一个名为getState的方法,该方法将返回存储的当前状态 是什么阻止我的应用程序中的某个代码(意外地)修改从存储返回的状态 假设我称之为: let state = store.getState(); state.someProperty = 'fun'; 我在store对象的getState上找到的实现只是返回内部状态对象,该对象被每个新操作覆盖 const getState = () => state; 在操作/新状态之间,是什么阻止代码修改另一订阅服务器将读取的状态?

store
有一个名为
getState
的方法,该方法将返回存储的当前状态

是什么阻止我的应用程序中的某个代码(意外地)修改从
存储
返回的
状态

假设我称之为:

let state = store.getState();
state.someProperty = 'fun';
我在
store
对象的
getState
上找到的实现只是返回内部状态对象,该对象被每个新操作覆盖

const getState = () => state;
在操作/新状态之间,是什么阻止代码修改另一订阅服务器将读取的状态?在我上面的示例中,将
someProperty
设置为
'fun'
将一直保存在
state
属性的
存储中,直到被覆盖

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

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

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


另外,这与Angular没有特别关系,这也是我没有添加标签的原因,以允许更多不习惯Angular的人回答这个问题。

答案是:什么都没有。:)

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

然而,变异将破坏时间旅行调试,以及使测试不可靠。更重要的是,React-Redux库假定您将不可变地处理您的状态,并依赖于浅层相等比较来查看状态是否已更改。(这就是为什么会出现在Redux常见问题解答中的原因。99.9%的情况下,这是由于意外突变造成的。)


如果你担心变异,你可以使用像Immutable.js这样的库而不是普通的js对象,或者使用几种工具中的一种来实现。

你是说我需要一个不可变的模型(来自Immutable.js或类似的),或者我需要在测试/开发时冻结我的状态,而不是在生产中冻结?正如我所说的,Redux本身并没有强制实现不变性。即使您仔细编写reducer代码,或者使用不可变的更新实用程序库,从技术上讲,代码的任何部分都可以调用
getState
并改变内容。如果您想保证不会发生这种情况,您需要使用普通JS对象以外的其他对象,或者使用冻结普通对象的对象,以确保代码不会在任何地方发生变化。这就是说,应用程序的其余部分当然不应该在任何地方尝试变异状态,但它确实偶尔会发生。只是忍不住认为这是不好的-容易发生事故-猜测自动化测试将比以往任何时候都更重要…我在这里仍然有点重复:从技术上讲,变异在Redux中是合法的,这通常不是你想要的东西。如果你想阻止它,我列出了你可以使用的方法。例如,我的Redux插件目录的一部分列出了各种“在开发中冻结”工具,它们可以帮助捕获错误?是的,你是:)是的,意外突变是个问题。但正如我所列举的,有很多方法可以解决这个问题。基本的Redux模式本身使事情变得更简单,因为所有的“写”逻辑都转移到了reducer中,所以所有有意的更改都在一个区域中。从那里开始,只有
mapState
函数和可能的操作创建者才能访问该状态,这样就真正缩小了任何可能发生变异的地方。没有100%的保证,但在这和冻结/不可变LIB之间,这应该不是一个有意义的问题。