跳至主内容

Reducers

非官方测试版翻译

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

Redux FAQ:Reducers

如何在两个 reducer 间共享状态?必须使用 combineReducers 吗?

Redux 推荐的 store 结构是将状态对象按 key 拆分为多个“切片”或“领域”,并为每个数据切片提供独立的 reducer 函数进行管理。这类似于标准 Flux 模式中多个独立 store 的设计,Redux 提供了 combineReducers 工具函数来简化此模式。但请注意,combineReducers 并非 必须使用——它只是针对“每个状态切片对应单个 reducer 函数+普通 JavaScript 对象数据”这种常见场景的辅助工具。

许多用户后续尝试在 reducer 间共享数据时,发现 combineReducers 无法满足需求。以下是几种可行方案:

  • 若某个 reducer 需要访问其他状态切片的数据,可能需要重组状态树结构,让单个 reducer 处理更多数据

  • 可编写自定义函数处理特定动作,可能需要用自定义顶层 reducer 替代 combineReducers。也可使用 reduce-reducers 等工具:用 combineReducers 处理常规动作,同时为跨状态切片的特定动作运行更专业的 reducer

  • 异步逻辑中间件(例如 redux-thunk)可通过 getState() 访问整个状态。动作创建器可从状态中提取额外数据放入 action,确保每个 reducer 都能获得更新自身状态切片所需信息

需牢记:reducer 本质是普通函数——可自由组织/拆分(推荐拆分为更小可复用函数的“reducer 组合”模式)。子 reducer 若需额外数据计算新状态,父 reducer 可传递自定义第三参数。只需共同遵守 reducer 基本规则:(state, action) => newState,并以不可变方式更新状态(而非直接修改)。

扩展阅读

文档

讨论

必须使用 switch 语句处理动作吗?

不必。reducer 中可采用任意方式响应动作。虽然 switch 语句最常见,但使用 if 语句、函数查找表或抽象封装函数均可。实际上,尽管 Redux 要求 action 对象包含 type 字段,但 reducer 逻辑甚至不必依赖它来处理动作。当然,基于 type 的 switch 语句或查找表仍是标准实践。

扩展阅读

文档

讨论