就像 Reducers 中描述的一样,一个 Redux reducer 函数需要具备:
(previousState, action) => newState
特征的函数,函数的类型与 Array.prototype.reduce(reducer, ?initialValue) 这个函数很相似。Date.now()
或 Math.random()
,那么就会带来一些副作用。这意味着 state 的更新应该在"不可变(immutable)"的理念下完成,这就是说总是去返回一个新的更新后的对象,而不是直接去修改原始的 state tree。关于不可变(immutability)和突变(mutation)以及副作用
突变是一种不鼓励的做法,因为它通常会打乱调试的过程,以及 React Redux 的
connect
函数:
- 对于调试过程, Redux DevTools 期望重放 action 记录时能够输出 state 值,而不会改变任何其他的状态。突变或者异步行为会产生一些副作用,可能使调试过程中的行为被替换,导致破坏了应用。
- 对于 React Redux
connect
来说,为了确定一个组件(component)是否需要更新,它会检查从mapStateToProps
中返回的值是否发生改变。为了提升性能,connect
使用了一些依赖于不可变 state 的方法。并且使用浅引用(shallow reference)来检测状态的改变。这意味着直接修改对象或者数组是不会被检测到的并且组件不会被重新渲染。其他的副作用像在 reducer 中生成唯一的 ID 或者时间戳时也会导致代码的不可预测并且难以调试和测试。
因为上面这些规则,在去学习具体的组织 Redux reducer 的技术之前,了解并完全理解下面这些核心概念是十分重要的。
核心概念:
阅读列表:
combineReducers
combineReducers
combineReducers
核心概念:
Reading List:
阅读列表:
核心概念:
阅读列表
核心概念:
阅读列表: