Existe uma maneira de despachar ações entre dois módulos vuex com espaço para nome?

159

É possível despachar uma ação entre módulos com espaço para nome?

Por exemplo, eu tenho os módulos vuex "gameboard" e "notification". Cada um tem espaço para nome. Gostaria de despachar uma ação do tabuleiro de jogo para o módulo de notificação.

Eu pensei que poderia usar o nome do módulo no nome da ação de despacho como este:

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

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

Mas quando tento fazer isso, obtenho erros que me fazem pensar que a vuex está tentando despachar uma ação dentro do meu módulo da placa de jogo:

[vuex] tipo de ação local desconhecido: notification / triggerSelfDismissingNotification, tipo global: gameboard / notification / triggerSelfDismissingNotification

Existe uma maneira de despachar do módulo vuex para o módulo ou preciso criar algum tipo de ponte na instância raiz do vuex?

Chris Schmitz
fonte

Respostas:

344

Você só precisa especificar que está enviando a partir do contexto raiz:

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

Agora, quando o despacho atingir a raiz, ele terá o caminho de espaço para nome correto para o módulo de notificações (relativo à instância raiz).

Isso pressupõe que você esteja configurando namespaced: trueno seu módulo de armazenamento vuex.

Jake
fonte
39
Este é o único hit na internet para a minha busca por uma solução. Obrigado por responder.
Peter Roehlen
9
Para ser justo, está documentado aqui vuex.vuejs.org/en/modules.html em "Acessando ativos globais em módulos com espaço para nome". Embora seja meio estranho para tomar.
Jake
2
Adoro o vue, mas parece-me que o vuex adiciona mais camadas de dificuldade do que simplifica. Agora eu sei que esse não é o objetivo da vuex, mas ainda assim, não é chato que eu sempre precise estar ciente de algumas convenções como neste exemplo notification/trigger, então se eu quero que seja um pouco mais genérico ${NOTIF_TYPE_NAME}/${NOTIF_TRIGGER_ACTION}, ainda preciso da barra, ou até mesmo criar uma função auxiliar para isso, sinto que quando quero que meu aplicativo seja mais modular, pago muito mais do que recebo. Esta é minha opinião
Dima Gimburg 14/02
11
Você pode usar this.dispatch. Não precisa {root: true}. Isso é global.
precisa saber é o seguinte
6
Não, você tem que usar {root: true}. O caso que você quis dizer é provavelmente o envio para um módulo filho, que de fato (e obviamente) não precisa desse sinalizador.
Kursus #
0

Como mencionado @ MKatleast3

Você pode usar this.dispatch. Não precisa de {root: true}opções de envio. Isso é global.

Slowaways
fonte