javascript - Redux 中的状态突变

标签 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 不进行验证来防止这种行为?
我们怎样才能确保开发商永远不会这样做呢?

最佳答案

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

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

为了确保您的开发人员不会这样做,我想您最好的选择是建立良好的开发纪律,对您的 reducer 进行单元测试,在这些测试中使用deep-freeze库,并强制deep-freeze 在代码审查中的使用。

关于javascript - Redux 中的状态突变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43674575/

相关文章:

javascript - 从数组 winjs 更新 ListView 中的分数

javascript - 调试 javascript,同时检查 html 和 css 的变化

reactjs - axios catch 不捕获错误

hadoop - Hbase错误:java.lang.ClassCastException:org.apache.hadoop.io.Text无法转换为org.apache.hadoop.hbase.client.Mutation

javascript - react useReducer : How to combine multiple reducers?

javascript - jQuery 执行缓慢的常见原因以及如何优化代码?

javascript - 为什么两个函数调用都返回相同的值?

reactjs - 将 Redux 表单与语义 UI 结合使用

javascript - 将状态属性传递给路由中的组件

redux - 在 Redux 中编写高阶 reducer