跳至主要内容

Redux 常见问题解答:Reducers

目录

Reducers

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

Redux 商店的建议结构是将状态对象按键拆分为多个“切片”或“域”,并提供单独的 reducer 函数来管理每个单独的数据切片。这类似于标准 Flux 模式如何拥有多个独立的商店,而 Redux 提供了 combineReducers 实用函数来简化此模式。但是,重要的是要注意 combineReducers 不是必需的——它只是一个用于将每个状态切片具有单个 reducer 函数(使用普通 JavaScript 对象作为数据)的常见用例的实用函数。

许多用户后来想尝试共享两个 reducer 之间的数据,但发现 combineReducers 不允许他们这样做。可以使用几种方法

  • 如果 reducer 需要知道另一个状态切片中的数据,则可能需要重新组织状态树形状,以便单个 reducer 处理更多数据。
  • 您可能需要编写一些自定义函数来处理其中的一些操作。这可能需要用您自己的顶级 reducer 函数替换combineReducers。您也可以使用诸如reduce-reducers之类的工具来运行combineReducers处理大多数操作,但也可以为跨越状态切片的特定操作运行更专门的 reducer。
  • 带有异步逻辑的中间件,例如redux-thunk可以通过getState()访问整个状态。操作创建者可以从状态中检索附加数据并将其放入操作中,以便每个 reducer 都拥有足够的信息来更新其自己的状态切片。

一般来说,请记住 reducer 只是函数——您可以以任何您想要的方式组织和细分它们,并且鼓励您将它们分解成更小、可重用的函数(“reducer 组合”)。在这样做时,如果您需要额外的信息来计算其下一个状态,您可以从父 reducer 传递一个自定义的第三个参数给子 reducer。您只需要确保它们一起遵循 reducer 的基本规则:(state, action) => newState,并且以不可变的方式更新状态,而不是直接修改它。

更多信息

文档

讨论

我必须使用switch语句来处理操作吗?

不。您可以使用任何您喜欢的方法来响应 reducer 中的操作。switch语句是最常见的方法,但使用if语句、函数查找表或创建一个抽象此过程的函数也是可以的。事实上,虽然 Redux 确实要求操作对象包含一个type字段,但您的 reducer 逻辑甚至不必依赖它来处理操作。也就是说,标准方法绝对是使用基于type的 switch 语句或查找表。

更多信息

文档

讨论