有没有办法在两个命名空间的vuex模块之间分配操作?

Chr*_*itz 113 vue.js vuex vuejs2

是否可以在命名空间模块之间调度操作?

例如,我有vuex模块"gameboard"和"notification".每个都是命名空间.我想从游戏板向通知模块发送一个动作.

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

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

// store/modules/notification.js
const actions = {
    triggerSelfDismissingNotification (context, payload) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试这样做时,我得到的错误让我觉得vuex试图在我的游戏板模块中发送一个动作:

[vuex] unknown local action type:notification/triggerSelfDismissingNotification,global type:gameboard/notification/triggerSelfDismissingNotification

有没有从vuex模块调度到模块的方法,还是需要在root vuex实例中创建某种桥接?

Jak*_*ake 253

您只需要指定从根上下文调度:

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

现在,当调度到达根时,它将具有通知模块的正确命名空间路径(相对于根实例).

假设您正在设置namespaced: truevuex商店模块.

  • 这是我在互联网上搜索解决方案的唯一打击.谢谢回答. (30认同)
  • 你可以使用`this.dispatch`.它不需要`{root:true}`.这是全球性的. (9认同)
  • 公平地说,这里记录了https://vuex.vuejs.org/en/modules.html"在命名空间模块中访问全局资产".虽然接受它有点尴尬. (6认同)
  • 不,您不必使用`{root:true}`。您要说明的情况可能是分派给子模块,该子模块确实(显然)不需要此标志。 (4认同)
  • 我喜欢vue,但在我看来vuex增加了更多的难度而不是使其更加简单。现在我知道这不是vuex的目的,但是仍然烦人,我总是需要了解一些惯例,例如本例中的“ notification / trigger”,然后,如果我希望它更多一点的话通用我做``$ {NOTIF_TYPE_NAME} / $ {NOTIF_TRIGGER_ACTION}``,仍然需要斜杠,甚至为此创建一个辅助函数,我觉得当我希望我的应用程序更加模块化时,我付出的代价比我多得多得到。这是我的意见 (2认同)