前提条件:Reducer 概念
如 "Redux 基础" 第 3 部分:状态、动作和 Reducer 中所述,Redux Reducer 函数
- 应该具有
(previousState, action) => newState
的签名,类似于您传递给Array.prototype.reduce(reducer, ?initialValue)
的函数类型 - 应该“纯”,这意味着 Reducer
- 不执行副作用(例如调用 API 或修改非局部对象或变量)。
- 不调用非纯函数(例如
Date.now
或Math.random
)。 - 不修改其参数。如果 Reducer 更新状态,则不应修改现有状态对象。相反,它应该生成一个包含必要更改的新对象。对于 Reducer 更新的任何状态子对象,应使用相同的方法。
关于不可变性、副作用和修改的说明
不鼓励修改,因为它通常会破坏时间旅行调试和 React Redux 的
connect
函数
- 对于时间旅行,Redux DevTools 期望重放记录的动作会输出一个状态值,但不会改变其他任何东西。像修改或异步行为这样的副作用会导致时间旅行在步骤之间改变行为,从而破坏应用程序。
- 对于 React Redux,
connect
会检查从mapStateToProps
函数返回的 props 是否已更改,以确定组件是否需要更新。为了提高性能,connect
会使用一些依赖于状态不可变的快捷方式,并使用浅引用相等性检查来检测更改。这意味着对对象和数组进行直接修改所做的更改将不会被检测到,组件也不会重新渲染。其他副作用,例如在 Reducer 中生成唯一 ID 或时间戳,也会使代码不可预测,更难调试和测试。
由于这些规则,在继续学习组织 Redux Reducer 的其他特定技术之前,必须完全理解以下核心概念
Redux Reducer 基础知识
关键概念:
- 以状态和状态形状为思考单位
- 通过状态切片委托更新责任(reducer 组合)
- 高阶 reducer
- 定义 reducer 初始状态
阅读列表:
- "Redux Fundamentals" 第 3 部分:状态、动作和 reducer
- Redux 文档:减少样板代码
- Redux 文档:实现撤销历史记录
- Redux 文档:
combineReducers
- 高阶 reducer 的力量
- Stack Overflow:存储初始状态和
combineReducers
- Stack Overflow:状态键名和
combineReducers
纯函数和副作用
关键概念:
- 副作用
- 纯函数
- 如何用组合函数的方式思考
阅读列表:
不可变数据管理
关键概念:
- 可变性与不可变性
- 安全地不可变更新对象和数组
- 避免修改状态的函数和语句
阅读列表:
数据规范化
关键概念:
- 数据库结构和组织
- 将关系/嵌套数据拆分为单独的表
- 为给定项目存储单个定义
- 通过 ID 引用项目
- 使用以项目 ID 为键的对象作为查找表,以及 ID 数组来跟踪排序
- 关联关系中的项目
阅读列表: