【问题标题】:React/Flux - Why do I need a action-dispatcher?React/Flux - 为什么我需要一个动作调度器?
【发布时间】:2016-03-16 04:48:47
【问题描述】:

我知道我需要一个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);
    }
}

这是否适用于多个商店监听同一事件的情况,例如StoreAStoreB 也监听ADD_ITEM

【问题讨论】:

    标签: reactjs action flux reactjs-flux


    【解决方案1】:

    调度程序在调用时一一触发动作。您需要调度员,因为:

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

    2. 此外,调度程序维护一个回调数组,以便为​​每个“动作”触发。这对于在多个商店上为同一操作调用回调很有用。当一个商店订阅一个动作(使用register)时,调度器添加与之关联的 registerHandler 并将其添加到一个数组中。借助此功能,您可以在需要时注册/注销您的商店。并且根据操作类型,您可以对所有注册的商店进行相应的更改。 如果您不使用调度程序,则在编写操作部分时,您将不得不担心所有必须通知的商店。不好!

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

    【讨论】:

    • 感谢您的精彩回答!我有另一个与此相关的问题,这就是为什么我首先在​​这里提出这个问题。我需要从一个操作返回一个值(新创建的项目的 ID)并将其传递给下一个操作。我是否应该从 Store 中分派包括 ID 在内的下一个操作,而不是在其他操作之后分派多个操作?另一个问题是here
    • 最好的办法是使用相同的操作并在两个存储上监听它,并相应地进行更改。其实,总有办法做到的。你只需要稍微调整你的代码。您使用此 {data_for_store1: {...},data_for_store2:{...},action:'ADD_ITEM'} 调度,两个商店现在可以使用相同的操作。这有帮助吗?
    • 我一开始就是这么做的,但是 action1 在 StoreA 中创建了一个新 ID,我需要以某种方式将新创建的 ID 传递给 StoreB。这可以通过修改调度程序来完成,以便我可以在调度后返回值吗?
    • 在这种情况下,您可能不得不触发另一个动作。我不建议修改调度程序,而是修改操作和商店。如果一个商店需要来自另一家商店的数据,那么很可能两个商店都应该合并到一个商店中。在不同的基础上而不是在此基础上拆分商店。只是给你一些想法。
    • 不幸的是,由于数据模型的复杂性,无法将它们组合到一个商店中。从 StoreA 中触发其他操作会是一个坏建议吗?非常感谢您的快速帮助! :)
    猜你喜欢
    • 2016-06-25
    • 2017-01-28
    • 2018-07-31
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    相关资源
    最近更新 更多