是什么阻止代码改变商店状态?
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.
的几个工具之一
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.
的几个工具之一