Come creare un bus di eventi globale in Vue 2
introduzione
Il pattern bus di eventi/pubblicazione-sottoscrizione è un modo per far dialogare tra loro sezioni non correlate della tua applicazione.
Il sistema di eventi utilizzato nei componenti Vue può essere utilizzato in un modello bus di eventi/pubblicazione-sottoscrizione.
Nota: questo tutorial è specifico per Vue 2. In Vue 3, consigliato.
In questo articolo, applicherai il potente bus di eventi integrato di Vue.
Prerequisiti
Per completare questo tutorial, avrai bisogno di:
- Node.js installato localmente, cosa che puoi fare seguendo Come installare Node.js e creare un ambiente di sviluppo locale.
- Una certa familiarità con l'utilizzo dei componenti Vue.js potrebbe essere utile.
Questo tutorial è stato verificato con Node v15.3.0, npm
v6.14.9 e vue
v2.6.11.
Passaggio 1: impostazione del progetto
Ai fini di questo tutorial, creerai da un progetto Vue predefinito generato con @vue/cli
.
- npx @vue/cli create vue-event-bus-example --default
Questo configurerà un nuovo progetto Vue con configurazioni predefinite: Vue 2
, babel
, eslint
.
Passare alla directory del progetto appena creata:
- cd vue-event-bus-example
Dovrai creare il bus degli eventi ed esportarlo da qualche parte in modo che altri moduli e componenti possano usarlo. Innanzitutto, crea un nuovo file. Importa la libreria Vue. Quindi, esportane un'istanza.
import Vue from 'vue';
export const EventBus = new Vue();
Per questo tutorial, l'istanza è stata impostata sulla variabile EventBus
.
Quello che stai essenzialmente ottenendo è un componente completamente disaccoppiato dal DOM o dal resto della tua app. Tutto ciò che esiste su di esso sono i suoi metodi di istanza.
Ora che hai creato il bus degli eventi, dovrai importarlo nei tuoi componenti e chiamare gli stessi metodi che useresti se passassi messaggi tra i componenti padre e figlio.
Successivamente, applichiamo EventBus.$emit()
.
Passaggio 2: invio di eventi
Considera uno scenario con un componente che notifica all'intera app quante volte è stato fatto clic su di essa ogni volta che qualcuno fa clic su di essa.
Nota: questo esempio utilizza qui un componente a file singolo, ma puoi utilizzare qualsiasi metodo di creazione dei componenti che desideri.
Ecco come faresti per implementarlo 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>
Questo codice produce un pulsante. Facendo clic sul pulsante, l'evento verrà inviato su un canale (clicked
) con un payload (clickCount
).
Modifica App.vue
per utilizzare questo componente.
<template>
<div id="app">
<ClickCountButton></ClickCountButton>
</div>
</template>
<script>
import ClickCountButton from './components/ClickCountButton'
export default {
name: 'App',
components: {
ClickCountButton
}
}
</script>
Successivamente, applichiamo EventBus.$on
.
Passaggio 3: ricezione degli eventi
Ora qualsiasi altra parte della tua app può importare il bus degli eventi e ascoltare sul canale cliccato
utilizzando EventBus.$on(channel: string, callback(payload1, ...))
.
Applicalo alla tua applicazione 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>
Questo codice crea un listener di eventi per clicked
e registra un messaggio nella console con il numero di volte in cui è stato fatto clic sul pulsante.
Nota: se desideri ascoltare solo la prima emissione di un evento, puoi utilizzare EventBus.$once(channel: string, callback(payload1,...)).
Successivamente, applichiamo EventBus.$off
.
Passaggio 4: rimozione dei listener di eventi
Puoi annullare la registrazione del gestore dal canale cliccato
utilizzando EventBus.$off(channel: string, callback(payload1,...))
.
Applicalo alla tua applicazione 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>
Fornendo un evento e una richiamata, EventBus.$off
rimuoverà solo il listener per questa specifica richiamata.
Nota: puoi anche rimuovere tutti i listener per un particolare evento utilizzando EventBus.$off(clicked)
senza argomenti di callback.
E se hai davvero bisogno di rimuovere ogni singolo ascoltatore da EventBus
, indipendentemente dal canale, puoi chiamare EventBus.$off()
senza alcun argomento.
Ora hai utilizzato .$emit
, .$on
e .$off
.
Conclusione
In questo tutorial, hai utilizzato il potente bus di eventi integrato di Vue per ascoltare un evento clicked
e registrare un messaggio con il conteggio dei clic. Ciò è stato ottenuto utilizzando .$emit
, .$on
e .$off
.
Se desideri saperne di più su Vue.js, consulta la nostra pagina degli argomenti su Vue.js per esercizi e progetti di programmazione.