redux - Redux 中的 reducer 必须严格返回一个新的 state 对象吗?
问题描述
Redux 中 reducer 的一个规则是:我们应该将 state 视为只读,并返回一个新对象作为新 state。
但是有一个灰色地带:它必须严格返回一个新对象作为状态,还是我们可以返回相同的状态对象?
似乎通过查看常见代码,例如:
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不必严格返回一个新的状态对象,但可以返回相同的。但是严格的规则是状态必须是只读的?
解决方案
规则是你不能改变状态对象,因为这可能会破坏代码中其他地方的假设。返回相同的状态对象是可以的。
function goodReducer(state, action) {
return state;
}
function badReducer(state, action) {
state.counter = (state.counter || 0) + 1;
return state;
}
这样做的原因是为了确保渲染的 DOM 是正确的和最新的,对状态的更新必须通过调度程序。
尤其是:
- 在不受控制的情况下改变对象会使缓存无效(例如
shouldComponentUpdate
) - 变异对象可能导致呈现不一致的状态(例如,如果变异发生在 a 期间
render
)
返回未修改的状态很好。事实上,像 Immutable.js 这样的库经常会这样做。
推荐阅读
- javascript - 用户值未使用 React.js 存储在 Firebase 身份验证中
- javascript - 控制响应式布局的侧边栏并根据 React.js 中的当前路由更新标题组件
- css - GULP 仅在服务器启动后执行一次 watch-sass 任务
- java - 缓慢的 Cassandra 查询
- java - 如何使库存像商店一样不可编辑?
- linux - 监控cpu使用情况、gpu内存使用情况、swap内存使用情况和ram使用情况
- react-native - 在本机反应中动态创建组件
- java - 如何解决错误:java.lang.IllegalStateException:无法执行 CommandLineRunner
- pandas - pandas.DataFrame.to_markdown 将大整数转换为浮点数
- pointers - 知道为什么这个函数在循环队列中这样定义吗?