React / Flux - 为什么我需要一个动作调度员?

时间:2015-12-10 13:58:28

标签: reactjs action flux reactjs-flux

我知道我需要一个emit.change()调度程序,让所有组件都知道商店内部发生了变化。但我不明白为什么我需要分配行动而不是直接从行动中调用商店,

.i.e。我为什么要这样做:

var Dispatcher = require('dispatcher');
var MyActions = {
    addItem: function(item){
        Dispatcher.dispatch({
              action: 'ADD_ITEM',
              payload: item       
       })
    }
}

而不是:

var MyStore = require('mystore');
var MyActions = {
    addItem: function(item){
        MyStore.addItem(item);
    }
}

这是针对多个商店是否收听同一事件的情况,例如当StoreAStoreB同时收听ADD_ITEM时?

1 个答案:

答案 0 :(得分:9)

调度程序在被调用时逐个触发操作。你需要一个调度员,因为:

  1. 您希望以原子方式更改应用程序状态。这意味着,s1-> s2(a1),s2-> s3(a2)以同步方式。而不是s1-> s3(因为a1和a2)。如果您不这样做,您将不得不担心与此特定操作一起触发的其他操作,并猜测应用程序状态将如何针对所有这些组合进行更改。这是所有地狱破裂的地方,你的代码将变得难以维护。 想象一下,针对每个触发的操作在商店中编写一个if-else块,以检查其他操作是否也处于活动状态。调度程序确保它在dispatching已发送时不会调度。一次发一次。保持你的州树非常健康。

  2. 此外,调度员还会为每个“操作”维护一系列回调。这对于针对同一操作调用多个商店的回调非常有用。当商店订阅某个操作(使用register)时,调度程序会添加与其关联的registerHandler并将其添加到数组中。借助此功能,您可以在需要时注册/取消注册商店。根据操作类型,您可以根据注册的所有商店进行相应的更改。 如果您不使用调度员,则在编写操作部分时,您将不得不担心所有需要通知的商店。坏了!

  3. 通过这种方法,你唯一需要关注的是用一个动作来击中调度员。其余部分由调度员决定,该调度员根据操作通知所有需要change的商店。由于商店具有触发视图的回调,因此可以在需要时调用这些回调。这使您的代码非常模块化。