Есть ли способ распределять действия между двумя модулями vuex в пространстве имен?

159

Можно ли отправить действие между модулями пространства имен?

Например, у меня есть модули vuex "gameboard" и "уведомление". Каждый из них имеет пространство имен. Я хотел бы отправить действие с игровой доски в модуль уведомлений.

Я думал, что мог бы использовать имя модуля в имени действия отправки следующим образом:

// 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?

Крис Шмитц
источник

Ответы:

344

Вам просто нужно указать, что вы отправляете из корневого контекста:

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

Теперь, когда отправка достигает корня, у нее будет правильный путь к пространству имен к модулю уведомлений (относительно корневого экземпляра).

Предполагается, что вы устанавливаете namespaced: trueсвой модуль магазина vuex.

Джейк
источник
39
Это единственный хит в интернете для моего поиска решения. Спасибо за ответы.
Питер Ролен
9
Чтобы быть справедливым, это задокументировано здесь описано vuex.vuejs.org/en/modules.html в разделе «Доступ к глобальным активам в пространствах имен». Хотя это немного неловко воспринимать.
Джейк
2
Я люблю vue, но мне кажется, что vuex добавляет больше слоев сложности, а не упрощает ее. Теперь я знаю, что это не цель vuex, но все же, разве это не раздражает, что мне всегда нужно знать о некоторых соглашениях, как в этом примереnotification/trigger , тогда, если я хочу, чтобы это было немного более общим, я делаю ${NOTIF_TYPE_NAME}/${NOTIF_TRIGGER_ACTION}, все же Мне нужна косая черта или даже создание вспомогательной функции для этого, я чувствую, что когда я хочу, чтобы мое приложение было более модульным, я плачу намного больше, чем получаю. Это мое мнение
Дима Гимбург
11
Вы можете использовать this.dispatch. Это не нужно {root: true}. Это глобально.
MKatleast3
6
Нет, вы должны использовать {root: true}. Случай, который вы имели в виду, вероятно, отсылается к дочернему модулю, который действительно (и очевидно) не нуждается в этом флаге.
курсус
0

Как mencioned @ MKatleast3

Вы можете использовать this.dispatch. Это не нужно {root: true}в опциях отправки. Это глобально.

Slowaways
источник