Gibt es eine Möglichkeit, Aktionen zwischen zwei Namespace-Vuex-Modulen auszulösen?

158

Ist es möglich, eine Aktion zwischen Namespace-Modulen auszulösen?

ZB habe ich Vuex-Module "Gameboard" und "Benachrichtigung". Jeder hat einen Namespace. Ich möchte eine Aktion vom Spielbrett an das Benachrichtigungsmodul senden.

Ich dachte, ich könnte den Modulnamen im Namen der Versandaktion folgendermaßen verwenden:

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

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

Aber wenn ich das versuche, bekomme ich Fehler, die mich dazu bringen, dass vuex versucht, eine Aktion innerhalb meines Gameboard-Moduls auszulösen:

[vuex] unbekannter lokaler Aktionstyp: Benachrichtigung / TriggerSelfDismissingNotification, globaler Typ: Spielbrett / Benachrichtigung / TriggerSelfDismissingNotification

Gibt es eine Möglichkeit, von Vuex-Modul zu Modul zu versenden, oder muss ich eine Art Brücke in der Root-Vuex-Instanz erstellen?

Chris Schmitz
quelle

Antworten:

342

Sie müssen nur angeben, dass Sie aus dem Stammkontext versenden:

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

Wenn der Versand nun den Stamm erreicht, hat er den richtigen Namespace-Pfad zum Benachrichtigungsmodul (relativ zur Stamminstanz).

Dies setzt namespaced: truevoraus, dass Sie Einstellungen für Ihr vuex-Speichermodul vornehmen.

Jake
quelle
39
Dies ist der einzige Treffer im Internet für meine Suche nach einer Lösung. Danke für die Antwort.
Peter Roehlen
8
Um fair zu sein, ist es hier vuex.vuejs.org/en/modules.html unter "Zugriff auf globale Assets in Namespaced-Modulen" dokumentiert . Obwohl es etwas umständlich ist, es aufzunehmen.
Jake
2
Ich liebe Vue, aber es scheint mir, dass Vuex mehr Schwierigkeitsgrade hinzufügt, als es einfacher zu machen. Jetzt weiß ich, dass dies nicht der Zweck von vuex ist, aber es ist nicht ärgerlich, dass ich immer einige Konventionen wie in diesem Beispiel kennen notification/triggermuss. Wenn ich möchte, dass es ein bisschen allgemeiner ist, mache ich es ${NOTIF_TYPE_NAME}/${NOTIF_TRIGGER_ACTION}trotzdem Wenn ich den Schrägstrich brauche oder sogar eine Hilfsfunktion dafür erstelle, habe ich das Gefühl, dass ich viel mehr bezahle, als ich bekomme, wenn meine App modularer sein soll. Dies ist meine Meinung
Dima Gimburg
11
Sie können verwenden this.dispatch. Es braucht nicht {root: true}. Das ist global.
MKatleast3
6
Nein, du musst verwenden {root: true}. Der Fall, den Sie gemeint haben, ist wahrscheinlich das Versenden an ein untergeordnetes Modul, das dieses Flag tatsächlich (und offensichtlich) nicht benötigt.
Kursus
0

Wie erwähnt @ MKatleast3

Sie können verwenden this.dispatch. Es braucht nicht{root: true} Versandoptionen. Das ist global.

Slowaways
quelle