2017-02-16 91 views
0

store有一个名为getState的方法,它将返回商店的当前状态。防止代码更改商店状态的原因是什么?

什么防止代码在我的应用程序的某处(意外)从store修改返回的state

比方说,我称之为:

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

,我已经在getState发现store对象上简单地返回获取与每一个新的动作覆盖的内部状态对象的实现。

const getState =() => state; 

动作/新状态之间什么阻止代码修改将由另一个用户读取的状态?在我上面的示例中,设置someProperty'fun'将保留在storestate属性中,直到被覆盖。虽然我显然不应该修改状态,但是一个简单的错误可能会将状态绑定到某个组件上(不知不觉地)修改其输入 - 可能是在角度环境中的双向绑定?

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

不宜getState()实现其state模式的克隆?

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

回答

1

答案是:什么 :)

核心终极版库本身技术上如果状态得到突变与否并不真正关心。你实际上可以在你的缩减器中进行变异,或者让你的应用程序的其他部分得到状态树并对它进行变异,而商店本身不会知道或关心。

但是,突变会打破时间旅行调试,以及使测试不可靠。更重要的是,React-Redux库假设你将会不可动摇地处理你的状态,并依靠浅层次的比较来判断状态是否已经改变。 (这就是为什么"Why isn't my component re-rendering?"在Redux FAQ中的原因,99.9%的时间,这是由于偶然的突变导致的。)

如果你关心突变,你可以使用类似Immutable.js的库而不是普通的JS对象,或使用freezing your state in development to catch mutations的几种工具之一。

+0

你是说我需要有一个不可变的模型(来自immutable.js之类的),或者我需要在测试/开发时冻结我的状态,但不冻结生产? –

+0

正如我所说的,Redux本身并没有什么能够强化不可变性。即使您仔细编写Reducer代码或使用不可变更新实用程序库,技术上,代码的任何部分都可以调用getState并修改内容。如果你想保证不会发生,你需要使用除了普通JS对象以外的东西,或者冻结普通对象以确保代码不会在任何地方发生变异。也就是说,应用程序的其余部分当然不应该在任何地方改变状态,但它有时会偶然发生。 – markerikson

+0

只是不禁想到这是不好的 - 很容易发生意外 - 猜测自动化测试将比以往更重要... –