Redux:为什么不将动作和reducer放在同一个文件中?

pji*_*ers 21 javascript ecmascript-6 redux react-redux

我正在使用Redux创建一个应用程序,并且为了解决为什么最好将动作和缩减器放在单独的文件中.至少,这是我从所有例子中得到的印象.

每个操作或操作创建器似乎映射到由reducer调用的单个函数(在switch语句内).将它们放在同一个文件中是不合逻辑的?它还使操作类型和切换案例使用相同的常量更容易,因为它不必在文件之间导出/导入.

Sha*_*ere 28

来自Redux创作者Dan Abramov:

许多减速器可以处理一个动作.一个减速器可以处理许多动作.将它们放在一起否定了Flux和Redux应用程序如何扩展的许多好处.这导致代码膨胀和不必要的耦合.您失去了对来自不同地方的相同操作做出反应的灵活性,并且您的动作创建者开始像"设置者"一样,与特定的状态形状耦合,从而将组件耦合到它.

来自Redux文档:

我们建议您编写独立的小型reducer函数,每个函数负责更新特定的状态片.我们称这种模式为"减速器组成".一个给定的动作可以由所有,一些或没有一个处理.这使得组件与实际数据更改分离,因为一个操作可能影响状态树的不同部分,并且组件不需要知道这一点.

有关详细信息,请参阅Twitter上的此对话以及github 上的此问题.

  • 想象一下,您是一个致力于管理机场的应用程序团队的一员.您负责构建处理航班状态消息的应用程序部分.另一位开发人员正在开发应用程序的不同部分,该部分负责处理跑道上起飞和着陆的安排.应用程序的这两个部分由Redux状态的完全不同的分支处理,具有不同的reducer.您和其他开发人员都会编写需要响应应用程序特定部分的FLIGHT_CANCELLED操作的Reducer,即使您们都不知道对方正在做什么. (5认同)
  • 喔好吧.是的,在这个意义上有相似之处.但我不会这样想,因为有很多不同之处.我会说它更像是一个简单的观察者模式,其中只有一个观察者(商店的'currentReducer`).你可以将其他reducer组成一个root reducer的事实是一个很大的便利,但它并不像多个观察者那样真实.值得记住的是,所有组合的减速器最终都是一个接收每个动作的[单一功能](https://github.com/reactjs/redux/blob/master/src/combineReducers.js#L111-138). (4认同)
  • 实际上并没有多个减少订阅任何东西.它实际上只是一个根减速器(可以由其他减速器组成,但它仍然是单个函数)[被设置为商店的'currentReducer`](https://github.com/reactjs/redux/blob/master/ src/createStore.js#L57)创建商店时,或调用`store.replaceReducer()`时.当调度一个动作时,[商店的`currentState`被简单地替换为`currentState = currentReducer(currentState,action)`](https://github.com/reactjs/redux/blob/master/src/createStore.js# L170). (2认同)