跳至主内容
非官方测试版翻译

本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →

Reducer 前置概念

"Redux 基础"第 3 部分:状态、动作与 Reducers所述,Redux reducer 函数:

  • 应具有(previousState, action) => newState的函数签名,类似于传递给Array.prototype.reduce(reducer, ?initialValue)的函数类型

  • 必须是"纯函数",这意味着 reducer:

    • 不执行副作用(如调用 API 或修改非局部对象/变量)
    • 不调用非纯函数(如Date.nowMath.random
    • 不改变参数值。当 reducer 更新状态时,不应直接修改现有的状态对象,而应生成包含必要变更的新对象。对于状态中需要更新的任何子对象也应采用相同方式处理
关于不变性、副作用和变更的说明

直接变更状态对象通常会导致时间旅行调试失效,并影响 React Redux 的connect功能:

  • 时间旅行功能中,Redux DevTools 期望重放记录的动作能输出状态值但不产生其他变更。副作用(如直接变更或异步行为)会导致步骤间行为异常,破坏应用功能
  • React Redux 中,connect通过检查mapStateToProps返回的 props 是否变化来决定组件更新。为提升性能,connect依赖状态不可变性,并使用浅层引用相等性检查。这意味着对对象/数组的直接变更不会被检测到,导致组件不重新渲染

在 reducer 中生成唯一 ID 或时间戳等其他副作用也会使代码不可预测,增加调试和测试难度

鉴于这些规则,在深入学习 Redux reducer 的组织技巧前,必须完全理解以下核心概念:

Reducer 基础

核心概念

  • 基于状态和状态结构的思维方式

  • 按状态切片委托更新职责(reducer 组合

  • 高阶 reducers

  • 定义 reducer 初始状态

延伸阅读

纯函数与副作用

核心概念:

  • 副作用

  • 纯函数

  • 函数组合的思维方式

阅读清单:

不可变数据管理

核心概念:

  • 可变性与不可变性

  • 安全地不可变更新对象和数组

  • 避免使用会改变状态的函数和语句

阅读清单:

数据规范化

核心概念:

  • 数据库结构与组织

  • 将关系型/嵌套数据拆分到独立表

  • 存储项目的单一定义

  • 通过 ID 引用项目

  • 使用以项目 ID 为键的对象作为查找表,并用 ID 数组维护顺序

  • 在关系中关联项目

阅读清单: