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

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

拆分 Reducer 逻辑

对于任何有实际意义的应用,将_所有_更新逻辑放在单个 reducer 函数中会迅速变得难以维护。虽然没有硬性规定函数长度,但普遍共识是函数应该相对简短且最好只做一件事。因此,良好的编程实践是将冗长或多功能的代码拆解为更易理解的小模块。

由于 Redux reducer _本身_就是函数,这一原则同样适用。您可以将部分 reducer 逻辑拆分到新函数中,再由父函数调用。

这些新函数通常分为三类:

  1. 小型工具函数:包含多处可复用的逻辑片段(可能与具体业务逻辑无关)

  2. 处理特定更新情况的函数:通常需要除标准 (state, action) 外的额外参数

  3. 处理特定状态切片更新的函数:通常具有标准 (state, action) 参数签名

为明确区分,以下术语将用于不同函数类型和场景:

  • reducer:任何符合 (state, action) -> newState 签名的函数(即可作为 Array.prototype.reduce 参数的函数)

  • 根 reducer:实际传给 createStore 的首个参数,这是 reducer 逻辑中_必须_具备 (state, action) -> newState 签名的唯一部分

  • 切片 reducer:专门处理状态树特定切片更新的 reducer,通常通过 combineReducers 调用

  • 分支函数:处理特定 action 更新逻辑的函数,可能是 reducer 函数,也可能需要额外参数

  • 高阶 reducer:接收 reducer 作为参数和/或返回新 reducer 的函数(如 combineReducersredux-undo

"子 reducer" 一词在讨论中也指代根 reducer 之外的函数,但该术语不够精确。有时函数也被称为"业务逻辑"(与应用特定行为相关)或"工具函数"(与应用无关的通用函数)。

将复杂流程拆解为更小、更易理解的模块通常称为 功能分解。该概念适用于任何代码。但在 Redux 中,普遍采用第 3 种方式构建 reducer 逻辑——根据状态切片委托更新逻辑。Redux 将此概念称为 reducer 组合,这是目前最主流的 reducer 结构模式。事实上,Redux 专门为此提供了 combineReducers() 工具函数,抽象了基于状态切片委托工作的过程。需要注意的是,这并非_唯一_可用模式。实际上,同时使用三种方式拆分逻辑不仅是可行的,通常也是良好实践。重构 Reducers 章节展示了具体示例。