【问题标题】:State mutation in ReduxRedux 中的状态突变
【发布时间】:2017-09-26 05:45:40
【问题描述】:

我知道 Reducer 只是纯函数,它接受先前的状态和动作,并返回一个新的状态对象,而不是改变先前的状态。
但是虽然直接突变不是 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 不执行验证来防止这种行为?
我们如何确保开发人员永远不会这样做?

【问题讨论】:

    标签: javascript redux reducers mutation


    【解决方案1】:

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

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

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

    【讨论】:

    • 是的。核心 Redux 库实际上并不知道也不关心你是否改变了状态。主要是其他相关部分,如 DevTools 和 React-Redux 的 connect 函数,需要不可变地更新状态。实际上,我正在撰写一篇博文,讨论 Redux 真正关心的限制以及原因,以及您可以 做的其他事情。如果您有兴趣,请关注我在blog.isquaredsoftware.com 的博客(希望很快)。此外,github.com/markerikson/redux-ecosystem-links/blob/master/… 列出了更多冻结工具。
    猜你喜欢
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多