非官方测试版翻译
本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →
Reducer 前置概念
如"Redux 基础"第 3 部分:状态、动作与 Reducers所述,Redux reducer 函数:
-
应具有
(previousState, action) => newState的函数签名,类似于传递给Array.prototype.reduce(reducer, ?initialValue)的函数类型 -
必须是"纯函数",这意味着 reducer:
- 不执行副作用(如调用 API 或修改非局部对象/变量)
- 不调用非纯函数(如
Date.now或Math.random) - 不改变参数值。当 reducer 更新状态时,不应直接修改现有的状态对象,而应生成包含必要变更的新对象。对于状态中需要更新的任何子对象也应采用相同方式处理
关于不变性、副作用和变更的说明
直接变更状态对象通常会导致时间旅行调试失效,并影响 React Redux 的
connect功能:
- 时间旅行功能中,Redux DevTools 期望重放记录的动作能输出状态值但不产生其他变更。副作用(如直接变更或异步行为)会导致步骤间行为异常,破坏应用功能
- React Redux 中,
connect通过检查mapStateToProps返回的 props 是否变化来决定组件更新。为提升性能,connect依赖状态不可变性,并使用浅层引用相等性检查。这意味着对对象/数组的直接变更不会被检测到,导致组件不重新渲染在 reducer 中生成唯一 ID 或时间戳等其他副作用也会使代码不可预测,增加调试和测试难度
鉴于这些规则,在深入学习 Redux reducer 的组织技巧前,必须完全理解以下核心概念:
Reducer 基础
核心概念:
-
基于状态和状态结构的思维方式
-
按状态切片委托更新职责(reducer 组合)
-
高阶 reducers
-
定义 reducer 初始状态
延伸阅读:
纯函数与副作用
核心概念:
-
副作用
-
纯函数
-
函数组合的思维方式
阅读清单:
不可变数据管理
核心概念:
-
可变性与不可变性
-
安全地不可变更新对象和数组
-
避免使用会改变状态的函数和语句
阅读清单:
数据规范化
核心概念:
-
数据库结构与组织
-
将关系型/嵌套数据拆分到独立表
-
存储项目的单一定义
-
通过 ID 引用项目
-
使用以项目 ID 为键的对象作为查找表,并用 ID 数组维护顺序
-
在关系中关联项目
阅读清单: