【问题标题】:React Flux - Return value from flux dispatcher / storeReact Flux - 来自通量调度程序/存储的返回值
【发布时间】:2016-03-03 10:22:21
【问题描述】:

我正在使用flux-patternflux dispatcher。在创建新的 TextItem 后,我需要将一个值从“TextStore”返回到一个操作,因为我需要在另一个商店中引用它。 这是我想做的一个非常简单的版本:

// stores.ts
var TextStore = {
    add(){
        // here I want to return a new ID
        return createRandomID();
    }
    ...
}
var ModuleStore = {
    labelTextID; // refers to `id` on Text
    ...
}


// moduleactions.ts
...
import PageActions from './PageActions';
var ModuleActions = {
    add: function (module) {
        var textID = PageActions.add(); // here I need to get the ID of the newly create `Text`
        module.labelTextID = textID;
        Dispatcher.dispatch({
            action: 'ADD_MODULE',
            module: module
        })
    },
    ...
}

现在,当我通过调度操作添加一个新的Module 时,我还想创建一个新的Text 并从之前的商店返回其新创建的 ID。

最明显的方法是在ModuleActions 中要求TextStore 并直接调用add()。这是否违反通量模式?

有什么办法可以做到这一点,也许是承诺?通过调度程序向商店发送回调不起作用,因为当另一个调度未完成时我无法调度。

如果你们能帮助我,那就太好了!

【问题讨论】:

    标签: reactjs typescript dependencies promise flux


    【解决方案1】:

    直接调用 Store 的方法是 Flux 的反模式。如果你直接调用TextStore.add()那么你就没有关注

    Action -> Dispatcher -> Store --> View --> Action 循环。

    在不断变化中,数据应始终在action 中生成。当数据的生成过程是异步的时,这更有意义。在您的情况下,您能够解决这个问题,因为数据的生成不是异步的。您直接在 TextStore 中生成数据,然后担心如何返回该值。

    在您的情况下,在操作中生成id,就像它是异步后端事件一样,然后通过调度程序将该id 向下传递给TextStore,之后还将相同的ID 传递给ModuleStore 通过调度程序。

    var ModuleActions = {
        add: function (module) {
            var textID = new Date().getTime(); // this is the CHANGE i added
            PageActions.add(textID); 
            module.labelTextID = textID;
            Dispatcher.dispatch({
                action: 'ADD_MODULE',
                module: module
            })
        }
    }
    

    您还可以将其分解为更小、更具体的操作。我保持原样,以便突出显示您应该更改的一行。

    【讨论】:

    • 谢谢!我已经实现了一些类似的,我在 store 中添加了一个函数“getNewId()”,我在 action 中调用它。
    • 很高兴听到您成功了。我的两分钱是在 store 外部生成数据并通过 action 的有效负载将其传递,而不是在 store 内部生成数据。
    【解决方案2】:

    有没有办法实现这一点,也许是承诺?通过调度程序向商店发送回调不起作用,因为当另一个调度未完成时我无法调度。

    您可以在调度 ModuleActions.add 之前进行异步调用 PageActions.add(); 并将返回的值作为参数传递给 ModuleActions.add

    【讨论】:

    • 但是我有同样的问题,我无法返回 ID,因为PageActions.add() 也使用了 Dispatcher。我必须打电话给PageStore.add(),但我认为在行动中使用商店是违反通量模式的
    猜你喜欢
    • 2017-02-10
    • 1970-01-01
    • 2015-09-06
    • 2017-02-16
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 2016-06-23
    • 2011-09-06
    相关资源
    最近更新 更多