Redux中的reducer必须严格返回新的state对象吗?

Redux中的reducer必须严格返回新的state对象吗?,redux,redux-reducers,Redux,Redux Reducers,Redux中reducer的一个规则是:我们应该将状态视为只读,并返回一个新对象作为新状态 但有一个灰色地带:它必须严格地返回一个新对象作为状态,还是我们可以返回相同的状态对象 通过查看常见代码,例如: function favoriteColors(state, action) { if (state === undefined) { state = []; } if (action.type === 'ADD') { return Array.from(new

Redux中reducer的一个规则是:我们应该将状态视为只读,并返回一个新对象作为新状态

但有一个灰色地带:它必须严格地返回一个新对象作为状态,还是我们可以返回相同的状态对象

通过查看常见代码,例如:

function favoriteColors(state, action) {
  if (state === undefined) {
    state = [];
  }

  if (action.type === 'ADD') {
    return Array.from(new Set([...state, action.color]));  // new array
  } else if (action.type === 'REMOVE') {
    return state.filter(color => color !== action.color);  // new array
  } else {
    return state;
  }
}

action.type
未知时,将返回相同的状态对象。因此,规则是reducer不必严格地返回新的state对象,但可以返回相同的state对象。但严格的规则是状态必须是只读的?

规则是不能对状态对象进行变异,因为这可能会破坏代码中其他地方的假设。可以返回相同的状态对象

功能(状态、动作){
返回状态;
}
功能(状态、动作){
state.counter=(state.counter | | 0)+1;
返回状态;
}
这样做的原因是为了确保呈现的DOM是正确的和最新的,对状态的更新必须通过dispatcher进行

特别是:

  • 在非受控环境中改变对象会使缓存失效(例如,
    shouldComponentUpdate
  • 变异对象可能会导致呈现不一致的状态(例如,如果变异发生在
    渲染过程中

返回未修改的状态是可以的。事实上,像Immutable.js这样的库通常会这样做

规则是您不能改变状态对象,因为这可能会破坏代码中其他地方所做的假设。可以返回相同的状态对象

功能(状态、动作){
返回状态;
}
功能(状态、动作){
state.counter=(state.counter | | 0)+1;
返回状态;
}
这样做的原因是为了确保呈现的DOM是正确的和最新的,对状态的更新必须通过dispatcher进行

特别是:

  • 在非受控环境中改变对象会使缓存失效(例如,
    shouldComponentUpdate
  • 变异对象可能会导致呈现不一致的状态(例如,如果变异发生在
    渲染过程中

返回未修改的状态是可以的。事实上,像Immutable.js这样的库通常会这样做

我相信你的理解是正确的。要遵循的规则是状态为只读。因此,如果减速器不需要改变状态,返回原始状态是完全可以接受的。我相信你的理解是正确的。要遵循的规则是状态为只读。因此,如果减速器不需要改变状态,返回原始状态是完全可以接受的。