Como criar um barramento de evento global no Vue 2
Introdução
O padrão de barramento de evento/publicação-assinatura é uma maneira de fazer com que seções não relacionadas de seu aplicativo conversem entre si.
O sistema de eventos usado nos componentes Vue pode ser usado em um padrão de barramento de eventos/publicação-assinatura.
Nota: Este tutorial é específico para Vue 2. Em Vue 3, recomendado.
Neste artigo, você aplicará o poderoso barramento de eventos integrado do Vue.
Pré-requisitos
Para concluir este tutorial, você precisará de:
- Node.js instalado localmente, o que você pode fazer seguindo Como instalar o Node.js e criar um ambiente de desenvolvimento local.
- Alguma familiaridade com o uso de componentes Vue.js pode ser benéfica.
Este tutorial foi verificado com Node v15.3.0, npm
v6.14.9 e vue
v2.6.11.
Passo 1 — Configurando o Projeto
Para este tutorial, você construirá a partir de um projeto Vue padrão gerado com @vue/cli
.
- npx @vue/cli create vue-event-bus-example --default
Isso configurará um novo projeto Vue com as configurações padrão: Vue 2
, babel
, eslint
.
Navegue até o diretório do projeto recém-criado:
- cd vue-event-bus-example
Você precisará criar o barramento de eventos e exportá-lo para algum lugar para que outros módulos e componentes possam usá-lo. Primeiro, crie um novo arquivo. Importe a biblioteca Vue. Em seguida, exporte uma instância dele.
import Vue from 'vue';
export const EventBus = new Vue();
Para este tutorial, a instância foi definida para a variável EventBus
.
O que você está obtendo essencialmente é um componente totalmente desacoplado do DOM ou do restante do seu aplicativo. Tudo o que existe nele são seus métodos de instância.
Agora que você criou o barramento de eventos, precisará importá-lo para seus componentes e chamar os mesmos métodos que usaria se estivesse passando mensagens entre os componentes pai e filho.
Em seguida, vamos aplicar EventBus.$emit()
.
Passo 2 — Enviando Eventos
Considere um cenário com um componente que notifica o aplicativo inteiro quantas vezes ele foi clicado sempre que alguém clica nele.
Observação: este exemplo usa um componente de arquivo único aqui, mas você pode usar qualquer método de criação de componentes que desejar.
Aqui está como você implementaria isso usando EventBus.$emit(channel: string, payload1: any, ...)
:
<template>
<button @click="emitGlobalClickEvent()">{{ clickCount }}</button>
</template>
<script>
import { EventBus } from '@/event-bus';
export default {
data() {
return {
clickCount: 0
}
},
methods: {
emitGlobalClickEvent() {
this.clickCount++;
EventBus.$emit('clicked', this.clickCount);
}
}
}
</script>
Este código produz um botão. Clicar no botão enviaria o evento em um canal (clicked
) com uma carga útil (clickCount
).
Modifique App.vue
para usar este componente.
<template>
<div id="app">
<ClickCountButton></ClickCountButton>
</div>
</template>
<script>
import ClickCountButton from './components/ClickCountButton'
export default {
name: 'App',
components: {
ClickCountButton
}
}
</script>
Em seguida, vamos aplicar EventBus.$on
.
Passo 3 — Recebendo Eventos
Agora, qualquer outra parte do seu aplicativo pode importar o barramento de eventos e ouvir no canal clicado
usando EventBus.$on(channel: string, callback(payload1, ...))
.
Aplique isso ao seu aplicativo modificando App.vue
:
<script>
import { EventBus } from './event-bus';
import ClickCountButton from './components/ClickCountButton'
export default {
name: 'App',
components: {
ClickCountButton
}
}
const clickHandler = function(clickCount) {
console.log(`The button has been clicked ${clickCount} times!`)
}
EventBus.$on('clicked', clickHandler);
</script>
Esse código cria um ouvinte de evento para clicked
e registra uma mensagem no console com o número de vezes que o botão foi clicado.
Nota: Se você quiser apenas ouvir a primeira emissão de um evento, você pode usar EventBus.$once(channel: string, callback(payload1,...))
.
Em seguida, vamos aplicar EventBus.$off
.
Etapa 4 — Removendo ouvintes de eventos
Você pode cancelar o registro do manipulador do canal clicado
usando EventBus.$off(channel: string, callback(payload1,...))
.
Aplique isso ao seu aplicativo modificando App.vue
:
<script>
import { EventBus } from './event-bus';
import ClickCountButton from './components/ClickCountButton'
export default {
name: 'App',
components: {
ClickCountButton
}
}
const clickHandler = function(clickCount) {
console.log(`The button has been clicked ${clickCount} times!`)
}
EventBus.$on('clicked', clickHandler);
EventBus.$off('clicked', clickHandler);
</script>
Ao fornecer um evento e um retorno de chamada, EventBus.$off
apenas removerá o ouvinte para esse retorno de chamada específico.
Observação: você também pode remover todos os ouvintes de um determinado evento usando EventBus.$off(clicked)
sem nenhum argumento de retorno de chamada.
E se você realmente precisar remover todos os ouvintes de EventBus
, independentemente do canal, você pode chamar EventBus.$off()
sem nenhum argumento.
Agora, você utilizou .$emit
, .$on
e .$off
.
Conclusão
Neste tutorial, você usou o poderoso barramento de eventos interno do Vue para ouvir um evento clicked
e registrar uma mensagem com a contagem de cliques. Isso foi obtido utilizando .$emit
, .$on
e .$off
.
Se você quiser aprender mais sobre Vue.js, confira nossa página de tópicos Vue.js para ver exercícios e projetos de programação.