有没有办法在两个命名的vuex模块之间分派动作?


159

是否可以在命名空间模块之间分派动作?

例如,我有vuex模块“游戏板”和“通知”。每个都有名称空间。我想将一个动作从游戏板上调度到通知模块。

我以为可以在调度操作名称中使用模块名称,如下所示:

// store/modules/gameboard.js
const actions = {
    myaction ({dispatch}) {
        ...
        dispatch('notification/triggerSelfDismissingNotifcation', {...})
    }
}

// store/modules/notification.js
const actions = {
    triggerSelfDismissingNotification (context, payload) {
        ...
    }
}

但是,当我尝试执行此操作时,我收到一些错误,这些错误使vuex试图在我的游戏板模块中调度一个动作:

[vuex]未知的本地操作类型:通知/ triggerSelfDismissingNotification,全局类型:游戏板/通知/ triggerSelfDismissingNotification

有没有一种方法可以在vuex模块之间进行分配,还是需要在根vuex实例中创建某种桥接?

Answers:


343

您只需要指定要从根上下文分派:

// from the gameboard.js vuex module
dispatch('notification/triggerSelfDismissingNotifcation', {...}, {root:true})

现在,当分发到达根目录时,它将具有到通知模块的正确名称空间路径(相对于根实例)。

这是假设您要namespaced: true在vuex存储模块上进行设置。


39
这是我寻找解决方案的唯一途径。谢谢回答。
彼得·罗伦

8
公平地说,在“访问命名空间模块中的全局资产”中的vuex.vuejs.org/en/modules.html中对此进行了记录。虽然它是有种尴尬采取英寸
杰克

2
我喜欢vue,但在我看来vuex增加了更多的难度而不是使其更加简单。现在我知道这不是vuex的目的,但仍然令人讨厌,我总是需要了解一些类似于本示例的约定notification/trigger,然后,如果我希望它有点通用,我${NOTIF_TYPE_NAME}/${NOTIF_TRIGGER_ACTION}仍然需要这个斜杠,甚至需要为此创建一个辅助函数,我觉得当我希望我的应用程序更加模块化时,我付出的代价比得到的要多得多。这是我的意见
Dima Gimburg '18

11
您可以使用this.dispatch。不需要了{root: true}。这是全球性的。
MKatleast3'3

6
不,您必须使用{root: true}。您要说明的情况可能是分派给子模块,该子模块确实(显然)不需要此标志。
kursus

0

正如@ MKatleast3

您可以使用this.dispatch{root: true}调度选项中不需要。这是全球性的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.