核心描述
- 单一数据源:整个应用的全局 state 被存储在一棵 object tree 中,并且这个 object tree 只存在于唯一一个 store 中。
- State 是只读的:唯一改变 state 的方法就是触发 action,action 是一个用于描述已发生事情的普通对象。
- 使用纯函数来执行修改:为了描述 action 如何改变 state tree,需要编写纯的 reducers。
知识拓展
- 什么时候应该使用 redux:
- 在应用的大量地方,都存在大量的状态
- 应用状态会随着时间的推移而频繁更新
- 更新该状态的逻辑可能很复杂
- 中型和大型代码量的应用,很多人协同开发
- reducer 是一个函数,接收当前的 state 和一个 action 对象,必要时决定如何更新状态,并返回新状态。reducer 必须符合以下规则:
- 仅使用 state 和 action 参数计算新的状态值
- 禁止直接修改 state。必须通过复制现有的 state 并对复制的值进行更改的方式来做不可变更新
- 禁止任何异步逻辑、依赖随机值或导致其他副作用代码
- reducer 遵守上述规则的原因:
- redux 的目标之一是使代码可预测。当函数的输出仅根据输入参数计算时,更容易理解该代码的工作原理并对其进行测试
- 如果一个函数依赖于自身之外的变量,或者随机行为,永远不知道运行它时会发生什么
- 如果一个函数 mutate 了其他对象,比如它的参数,这可能会意外地改变应用程序的工作方式。这可能是错误的常见来源
- 不可变更新(Immutability),不能在 Redux 中更改 state 的原因:
- 会导致bug,例如 UI 未正确更新以显示最新值
- 更难理解状态更新的原因和方式
- 编写测试变的困难
- 打破了正确使用“时间旅行调试”的能力
- 违背了 Redux 的预期精神和使用模式