React/Flux - 为什么我需要一个动作调度器?
React/Flux - Why do I need a action-dispatcher?
我知道我需要一个 emit.change()
调度程序,让所有组件知道商店内发生了一些变化。但是我不明白为什么我需要调度动作而不是直接从动作内部调用存储,
.即我为什么要这样做:
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);
}
}
是否针对多个商店监听同一事件的情况,例如当 StoreA
和 StoreB
也监听 ADD_ITEM
时?
调度程序在调用时一个接一个地触发操作。您需要调度员因为:
您希望自动更改应用程序状态。这意味着,s1->s2(a1), s2->s3(a2) 以同步方式进行。而不是 s1->s3(因为 a1 和 a2)。如果您不这样做,您将不得不担心其他操作会与此特定操作一起触发,并猜测所有这些组合的应用程序状态将如何变化。这就是一切都崩溃的地方,您的代码将变得难以维护。 想象一下,为触发的每个动作在商店中编写一个 if-else 块,以检查其他动作是否也处于活动状态。调度程序确保它不会在已经 dispatching
时调度.一次派出一个。让你的状态树非常健康。
此外,调度程序还维护着一组要为每个 'action' 触发的回调。这对于为同一操作调用多个商店的回调很有用。当商店订阅一个动作(使用 register
)时,调度程序添加与其关联的 registerHandler 并将其添加到数组中。借助于此,您可以在需要时 register/unregister 您的商店。并且根据操作类型,您可以对所有注册的商店进行相应的更改。 如果不使用dispatcher,在编写action部分时,你将不得不担心所有必须通知的商店。不好!
使用这种方法,您唯一需要关注的就是用一个动作击中调度员。剩下的取决于调度程序,它会根据操作通知所有需要 change
的商店。由于商店具有触发视图的回调,因此可以在需要时调用这些回调。这使您的代码非常模块化。
我知道我需要一个 emit.change()
调度程序,让所有组件知道商店内发生了一些变化。但是我不明白为什么我需要调度动作而不是直接从动作内部调用存储,
.即我为什么要这样做:
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);
}
}
是否针对多个商店监听同一事件的情况,例如当 StoreA
和 StoreB
也监听 ADD_ITEM
时?
调度程序在调用时一个接一个地触发操作。您需要调度员因为:
您希望自动更改应用程序状态。这意味着,s1->s2(a1), s2->s3(a2) 以同步方式进行。而不是 s1->s3(因为 a1 和 a2)。如果您不这样做,您将不得不担心其他操作会与此特定操作一起触发,并猜测所有这些组合的应用程序状态将如何变化。这就是一切都崩溃的地方,您的代码将变得难以维护。 想象一下,为触发的每个动作在商店中编写一个 if-else 块,以检查其他动作是否也处于活动状态。调度程序确保它不会在已经
dispatching
时调度.一次派出一个。让你的状态树非常健康。此外,调度程序还维护着一组要为每个 'action' 触发的回调。这对于为同一操作调用多个商店的回调很有用。当商店订阅一个动作(使用
register
)时,调度程序添加与其关联的 registerHandler 并将其添加到数组中。借助于此,您可以在需要时 register/unregister 您的商店。并且根据操作类型,您可以对所有注册的商店进行相应的更改。 如果不使用dispatcher,在编写action部分时,你将不得不担心所有必须通知的商店。不好!使用这种方法,您唯一需要关注的就是用一个动作击中调度员。剩下的取决于调度程序,它会根据操作通知所有需要
change
的商店。由于商店具有触发视图的回调,因此可以在需要时调用这些回调。这使您的代码非常模块化。