Redux中的状态变异

时间:2017-04-28 07:34:53

标签: javascript redux reducers mutation

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



const reducer = (oldState = initialState, action) => {
  switch (action.type) {
    case "ACT": {
    	// mutate state directly instead of create a new one
      oldState.subobj.ssub.key = "hi hi";
      return oldState;
    } default: { 
      return oldState;
    }
  }
};




Full code here

为什么redux不执行验证来阻止这种行为?
我们如何确保开发人员永远不会这样做?

1 个答案:

答案 0 :(得分:3)

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

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

为了确保您的开发人员没有这样做,我猜您最好的办法是建立良好的开发规则,对减速器进行单元测试,在这些测试中使用deep-freeze库,并强制执行deep-freeze用法在代码审查。