Redux Reducer中...state的作用疑问:更新todos前为何展开原state
Reducer中
...state的实际作用 你现在的state里只有todos这一个属性,所以暂时不写...state的时候,useSelector能正常拿到todos数组,但这只是当前场景下的巧合,...state的真正作用是保留state中所有未被修改的属性,避免后续扩展功能时出问题。
具体来说:
- 应对state的扩展需求:现在你的Todo应用只用到了
todos,但如果以后要加新状态(比如筛选条件filter、正在编辑的todo IDcurrentEditId),不写...state的话,这些新增的属性会在你返回新状态时被直接丢弃。比如假设后续state变成:
const initialData = { todos: [], filter: 'all', currentEditId: null };
当你处理ADD_TODO时,如果只返回{ todos: [...] },新状态里就没有filter和currentEditId了,依赖这些状态的功能(比如筛选显示、编辑框状态)会直接失效。
- 遵循Redux不可变更新原则:Reducer要求必须返回新的状态对象,不能直接修改原state。
...state是浅复制原state的所有属性,然后再覆盖需要更新的todos,这样既保证了状态的不可变性,又完整保留了原state中其他不需要修改的内容。
简单说,现在不写...state看似没问题,但这是不规范的写法,会给未来的功能扩展埋坑,按照Redux的最佳实践,必须先展开...state再修改目标属性。
内容的提问来源于stack exchange,提问作者Krishna Bharadwaj
相关产品推荐
相关产品推荐

