本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →
拆分 Reducer 逻辑
对于任何有实际意义的应用,将_所有_更新逻辑放在单个 reducer 函数中会迅速变得难以维护。虽然没有硬性规定函数长度,但普遍共识是函数应该相对简短且最好只做一件事。因此,良好的编程实践是将冗长或多功能的代码拆解为更易理解的小模块。
由于 Redux reducer _本身_就是函数,这一原则同样适用。您可以将部分 reducer 逻辑拆分到新函数中,再由父函数调用。
这些新函数通常分为三类:
-
小型工具函数:包含多处可复用的逻辑片段(可能与具体业务逻辑无关)
-
处理特定更新情况的函数:通常需要除标准
(state, action)外的额外参数 -
处理特定状态切片更新的函数:通常具有标准
(state, action)参数签名
为明确区分,以下术语将用于不同函数类型和场景:
-
reducer:任何符合
(state, action) -> newState签名的函数(即可作为Array.prototype.reduce参数的函数) -
根 reducer:实际传给
createStore的首个参数,这是 reducer 逻辑中_必须_具备(state, action) -> newState签名的唯一部分 -
切片 reducer:专门处理状态树特定切片更新的 reducer,通常通过
combineReducers调用 -
分支函数:处理特定 action 更新逻辑的函数,可能是 reducer 函数,也可能需要额外参数
-
高阶 reducer:接收 reducer 作为参数和/或返回新 reducer 的函数(如
combineReducers或redux-undo)
"子 reducer" 一词在讨论中也指代根 reducer 之外的函数,但该术语不够精确。有时函数也被称为"业务逻辑"(与应用特定行为相关)或"工具函数"(与应用无关的通用函数)。
将复杂流程拆解为更小、更易理解的模块通常称为 功能分解。该概念适用于任何代码。但在 Redux 中,普遍采用第 3 种方式构建 reducer 逻辑——根据状态切片委托更新逻辑。Redux 将此概念称为 reducer 组合,这是目前最主流的 reducer 结构模式。事实上,Redux 专门为此提供了 combineReducers() 工具函数,抽象了基于状态切片委托工作的过程。需要注意的是,这并非_唯一_可用模式。实际上,同时使用三种方式拆分逻辑不仅是可行的,通常也是良好实践。重构 Reducers 章节展示了具体示例。