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
,并且以不可变的方式更新状态,而不是直接修改它。
更多信息
文档
讨论
- #601:关于 combineReducers 的一个问题,当一个操作与多个 reducer 相关时
- #1400:将顶级状态对象传递给分支 reducer 是否是一种反模式?
- Stack Overflow:使用组合 reducer 时如何访问状态的其他部分?
- Stack Overflow:使用 redux combineReducers 减少整个子树
- 在 Redux Reducer 之间共享状态
我必须使用switch
语句来处理操作吗?
不。您可以使用任何您喜欢的方法来响应 reducer 中的操作。switch
语句是最常见的方法,但使用if
语句、函数查找表或创建一个抽象此过程的函数也是可以的。事实上,虽然 Redux 确实要求操作对象包含一个type
字段,但您的 reducer 逻辑甚至不必依赖它来处理操作。也就是说,标准方法绝对是使用基于type
的 switch 语句或查找表。
更多信息
文档
讨论