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中的代码块。)
答案 0 :(得分:5)
变异状态是React中的反模式。 React使用渲染引擎,该引擎取决于状态变化是可观察的这一事实。通过比较先前状态和下一状态来进行该观察。它将改变带有差异的虚拟dom,并将更改的元素写回dom。
当你改变内部状态时,React不知道改变了什么,甚至更糟;它的当前状态的概念是不正确的。所以dom和虚拟dom将变得不同步。
Redux使用相同的想法来更新它的商店;减速器可以观察到一个动作,它可以计算商店的下一个状态。发出更改,例如react-redux connect
消耗的更改。
简而言之:永远不会改变国家。您可以使用stage-3扩展语法代替Object.assign:
{...previousState,...changes}
另请注意,阵列也是如此!