Javascript Redux中的状态突变

Javascript Redux中的状态突变,javascript,redux,reducers,mutation,Javascript,Redux,Reducers,Mutation,我知道减缩器只是纯粹的函数,它接受以前的状态和动作,并返回新的状态对象,而不是改变以前的状态。 但是,尽管直接突变不是Redux的哲学,它仍然是可能的(或者我错过了一些东西): const reducer=(oldState=initialState,action)=>{ 开关(动作类型){ 案例“法案”:{ //直接改变状态,而不是创建新状态 oldState.subobj.ssub.key=“hi-hi”; 返回旧状态; }默认值:{ 返回旧状态; } } };Redux无法进行此类验证,

我知道减缩器只是纯粹的函数,它接受以前的状态和动作,并返回新的状态对象,而不是改变以前的状态。
但是,尽管直接突变不是Redux的哲学,它仍然是可能的(或者我错过了一些东西):

const reducer=(oldState=initialState,action)=>{
开关(动作类型){
案例“法案”:{
//直接改变状态,而不是创建新状态
oldState.subobj.ssub.key=“hi-hi”;
返回旧状态;
}默认值:{
返回旧状态;
}
}

};Redux无法进行此类验证,因为它不知道特定操作的新数据是否应该实际更新状态。Redux使用reducer,因为它不知道如何更新您的状态。这是您的业务逻辑,因此您必须提供这种状态转换

Redux正在比较对象引用,这很快。如果它执行某种类型的复制状态树并递归地比较对象,则会导致性能损失


为了确保您的开发人员没有这样做,我想您最好的办法是建立良好的开发规程,对简化程序进行单元测试,在这些测试中使用
deepfreeze
库,并在代码评审中强制使用
deepfreeze

是的。核心Redux库实际上并不知道或关心是否改变了状态。主要是其他相关的部分,如DevTools和React-Redux的
connect
函数,需要不可变地更新状态。实际上,我正在写一篇博客文章,讨论Redux真正关心的限制以及为什么,与您可以做的其他事情相比。如果你感兴趣的话(希望很快),请关注我的博客。此外,更多的冻结工具列在。