【问题标题】:Is there a way to dispatch actions between two namespaced vuex modules?有没有办法在两个命名空间的 vuex 模块之间分派动作?
【发布时间】:2017-08-16 11:38:01
【问题描述】:

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

例如我有 vuex 模块“游戏板”和“通知”。每个都有命名空间。我想将游戏板中的动作发送到通知模块。

我想我可以像这样在调度动作名称中使用模块名称:

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

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

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

[vuex] 未知本地动作类型:notification/triggerSelfDismissingNotification,全局类型:gameboard/notification/triggerSelfDismissingNotification

有没有一种方法可以从 vuex 模块分派到模块,还是我需要在根 vuex 实例中创建某种桥接器?

【问题讨论】:

    标签: vue.js vuejs2 vuex


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 这是我在互联网上寻找解决方案的唯一一击。感谢您的回答。
    • 公平地说,它记录在 vuex.vuejs.org/en/modules.html 在“访问命名空间模块中的全局资产”中。虽然接受起来有点尴尬。
    • 我喜欢 vue,但在我看来 vuex 增加了更多的难度,而不是让它变得更简单。现在我知道这不是 vuex 的目的,但是,我总是需要注意一些约定,比如这个例子 notification/trigger,这不是很烦人,那么如果我想让它更通用一点,我做${NOTIF_TYPE_NAME}/${NOTIF_TRIGGER_ACTION},仍然需要斜线,甚至为此创建一个辅助函数,我觉得当我希望我的应用程序更加模块化时,我付出的比我得到的要多得多。这是我的看法
    • 您可以使用this.dispatch。它不需要{root: true}。这是全球性的。
    • 不,你必须使用{root: true}。您的意思的情况可能是分派到一个子模块,它确实(并且显然)不需要这个标志。
    【解决方案2】:

    dispatch('mobuleB/actionB', null, { root: true })

    【讨论】:

      【解决方案3】:

      如果你想在没有参数的情况下触发:

      dispatch('mobuleB/actionB', null, { root: true })
      

      还有这个:

      params use dispatch('mobuleB/actionB', {param}, { root: true })
      

      【讨论】:

        猜你喜欢
        • 2018-12-31
        • 2018-01-17
        • 1970-01-01
        • 1970-01-01
        • 2019-08-26
        • 1970-01-01
        • 2015-09-09
        • 2020-05-07
        相关资源
        最近更新 更多