Redux中的reducer是否必须严格返回新的状态对象?

问题描述 投票:1回答:1

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不必严格返回新的状态对象,而可以返回相同的状态对象。但是严格的规则是状态必须是只读的?

redux redux-reducers
1个回答
2
投票

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

function goodReducer(state, action) {
  return state;
}

function badReducer(state, action) {
  state.counter = (state.counter || 0) + 1;
  return state;
}

原因是为了确保渲染的DOM是正确的和最新的,对状态的更新必须流经调度程序。

特别是:

  • 在不受控制的情况下更改对象可能会使缓存无效(例如shouldComponentUpdate
  • 更改对象会导致呈现不一致的状态(例如,如果在render期间发生突变)

返回未修改的状态很好。实际上,像Immutable.js这样的库通常会这样做。

热门问题
推荐问题
最新问题