在减速机中改变状态有什么后果?

时间:2018-02-15 12:11:16

标签: react-redux

redux指南指出:

  

我们不会改变国家。我们使用Object.assign()创建一个副本。 Object.assign(state,{visibilityFilter:action.filter})也是错误的:它会改变第一个参数。您必须提供一个空对象作为第一个参数。您还可以启用对象扩展运算符提议来编写{... state,... newState}。

我碰巧发现自己编写了以下代码片段:

[actions.setSelection](state, {payload}) {
    state[payload.key] = payload.value;
    return state;
},

我对此感到不满,并重新审视了智慧指南。我已经把它重写为:

[actions.setSelection](state, {payload}) {
    const result = Object.assign({}, state);
    result[payload.key] = payload.value;
    return result;
},

我很确定我在我的代码的其他地方冒犯了上面提到的诫命。我没有考虑到因为没有勤奋追踪它们而产生什么样的后果?

(注意:上面的reducer语法是通过redux-actions。否则它将是reducer fn switch / case中的代码块。)

1 个答案:

答案 0 :(得分:5)

变异状态是React中的反模式。 React使用渲染引擎,该引擎取决于状态变化是可观察的这一事实。通过比较先前状态和下一状态来进行该观察。它将改变带有差异的虚拟dom,并将更改的元素写回dom。

当你改变内部状态时,React不知道改变了什么,甚至更糟;它的当前状态的概念是不正确的。所以dom和虚拟dom将变得不同步。

Redux使用相同的想法来更新它的商店;减速器可以观察到一个动作,它可以计算商店的下一个状态。发出更改,例如react-redux connect消耗的更改。

简而言之:永远不会改变国家。您可以使用stage-3扩展语法代替Object.assign:

{...previousState,...changes}

另请注意,阵列也是如此!