【发布时间】:2017-05-18 03:43:26
【问题描述】:
我想知道为什么我们应该在 reducer 中保持状态不可变。这是强制性的还是仅仅是推荐的方法? redux 是否利用不变性来做一些优化?
经过一些实验,我发现 redux 确实利用了这种不可变性的东西。一个证据是,当我们从 reducer 返回对状态的相同引用时,即使状态内的数据已更改,UI 也不会按应有的方式更新。 如下例所示:
const reducer = (state = [], action) => {
switch(action.type) {
case 'BRING_UP_NEXT_IMAGE':
state.push(state.shift());
break;
default:
return state;
}
return state;
};
UI 没有更新,因为 Redux 检测到相同的状态引用(值得考虑)。
这解释了如果我们想要更新 UI,我们必须返回对状态的新引用的必要性。 但是为什么 Redux 要求内部状态结构也应该是不可变的呢?据我所知,UI 是否更新仅取决于状态引用本身是否更改。即使我改变了内部结构,应用程序也能正常工作,如下所示:
const reducer = (state = [], action) => {
switch(action.type) {
case 'BRING_UP_NEXT_IMAGE':
state = state.concat(state.shift());
break;
default:
return state;
}
return state;
};
是的,我确实使用“state.shift()”改变了之前的状态,但是由于 state.concat 返回了对数组的新引用,所以状态本身是不同的引用,并且应用程序正常工作。
简而言之,我想知道的是,状态是否应该严格保持不可变是使 Redux 正常运行的必要条件,还是推荐的选项,以便应用程序可以通过在 shouldComponentUpdate 中启用浅比较来获得更好的性能绕过对账流程?
【问题讨论】:
标签: reactjs redux frontend immutability