Skip to main content

Redux 常见问答:Reducers

目录​

Reducers​

如何在两个 reducers 之间共享 state?必须使用 combineReducers 吗?​

Redux store 的建议结构是将 state 对象按键拆分为多个 slices 或 domains,并提供单独的 reducer 函数来管理每个 slice。这类似于标准 Flux 模式包含多个独立 stores 的方式,Redux 提供了 combineReducers 工具函数来使这种模式变得更容易。然而,需要重点注意 combineReducers 不是 必需的——它只是一个工具函数,适用于每个 state slice 只有一个 reducer 函数的常见用例,数据是纯 JavaScript 对象。

很多用户后来想尝试在两个 reducer 之间共享数据,但发现 combineReducers 不允许这样做。有几种解决办法:

  • 如果 reducer 需要知道来自另一个 state slice 的数据,则可能需要重新组织 state 树,以便单个 reducer 可以处理更多数据。
  • 你可能需要编写自定义函数来处理其中一些 actions。这可能需要用你自己的顶层 reducer 函数替换 combineReducers。你还可以使用诸如 reduce-reducers 之类的实用程序来运行 combineReducers 以处理大多数 actions,但也可以为跨 state slices 的特定的 actions 运行更专业的 reducer。
  • 具有异步逻辑的 middleware 例如 redux-thunk,可以通过 getState() 获取整个 state。Action creator 可以从 state 中检索额外的数据并将其放入 action 中,以便每个 reducer 都有足够的信息来更新自己的 state slice。

总之,请记住 reducer 仅仅只是函数——你可以按照自己的方式组织和细分它们,并且我们鼓励你将它们分解为更小的、可重用的函数(“reducer 组合”)。当你这样做时,如果子 reducer 需要额外的数据来计算它的下一个 state,你可以从父 reducer 传递一个自定义的第三个参数。你只需要确保它们一起遵循 reducer 的基本规则:(state, action) => newState,并且不可变地更新 state 而不是直接改变它。

更多信息​

文档

讨论

是否必须使用 switch 语句来处理 actions 吗?​

不是的,欢迎你使用任何方法来响应 reducer 中的 action。switch 语句只是最常用的方法,但完全可以使用 if 语句、函数查找表或创建一个将其抽象出来的函数。事实上,虽然 Redux 确实需要 action 对象包含一个 type 字段,但 reducer 逻辑甚至不必依赖它来处理 action。也就是说,标准方法肯定是使用 switch 语句或基于 type 的查找表。

更多信息​

文档

讨论