Skip to content

11. Projekt [vuejs-09]: Verwendung eines [eventBus]-Plugins

Das Projekt [vuejs-09] ist identisch mit dem Projekt [vuejs-08], mit dem Unterschied, dass es das Konzept eines Plugins einführt. Die Verzeichnisstruktur des Projekts sieht wie folgt aus:

Image

11.1. Das Plugin [./plugins/event-bus]

Das Skript [./event-bus.js] bleibt unverändert gegenüber dem vorherigen Beispiel:


import Vue from 'vue';
const eventBus = new Vue();
export default eventBus;

Das Plugin [./plugins/event-bus.js] sieht wie folgt aus:


export default {
  install(Vue, eventBus) {
    // ajoute une propriété [$eventBus] à la classe Vue
    Object.defineProperty(Vue.prototype, '$eventBus', {
      // lorsque Vue.$eventBus est référencé, on rend le 2ième paramètre [eventBus]
      get: () => eventBus,
    })
  }
}

Kommentare

  • Ein [Vue]-Plugin ist ein Objekt mit einer [install]-Funktion (Zeile 2). Diese Funktion wird automatisch aufgerufen, wenn ein Code die Verwendung des Plugins deklariert;
  • Zeilen 1–9: das vom Skript exportierte Objekt;
  • Zeile 2: Die [install]-Funktion nimmt hier zwei Parameter entgegen:
    • [Vue]: die durch die Anweisung [import Vue from ‘Vue’] erhaltene Funktion. Kann als Klasse betrachtet werden;
    • [eventBus]: das vom Skript [./event-bus] exportierte Objekt;
  • Zeilen 4–7: Ändern Sie die Definition (auch als Prototyp bezeichnet) der [Vue]-Funktion, indem Sie ihr die Eigenschaft [$eventBus] hinzufügen. Wenn wir in Begriffen der [Klasse] denken, wird die Eigenschaft [$eventBus] der [Vue]-Klasse hinzugefügt. Komponenten, die Instanzen von [Vue] sind, haben daher Zugriff auf diese neue Eigenschaft;
  • Zeile 6 gibt an, dass wir, wenn wir auf die Eigenschaft [Vue].$eventBus verweisen, den Parameter [eventBus] aus Zeile 2 erhalten. Wir werden etwas später sehen, dass dieser zweite Parameter das vom Skript [./event-bus.js] exportierte Objekt [eventBus] sein wird. Wenn also eine Komponente C den Ausdruck [C.$eventBus] verwendet, verweist sie letztendlich auf das vom Skript [./event-bus.js] exportierte [eventBus]-Objekt. Dadurch muss sie das Skript [./event-bus.js] nicht importieren. Das ist der Sinn des Plugins: den Zugriff auf das vom Skript [./event-bus.js] exportierte Objekt [eventBus] zu vereinfachen;
  • Beachten Sie, dass das Plugin selbst nicht unbedingt [event-bus.js] heißen muss. Es hätte beispielsweise auch [plugin-event-bus] heißen können;
  • Beachten Sie außerdem, dass das $ in [$eventBus] eine Konvention ist, die verwendet wird, um [Vue]-Eigenschaften zu kennzeichnen, die über Plugins hinzugefügt wurden. Sie sind nicht verpflichtet, dieser Konvention zu folgen. In diesem Text werden wir sie befolgen;

11.2. Das Hauptskript [main.js]

Das Skript [./plugins/event-bus.js] definiert ein Plugin für das [Vue.js]-Framework. Dieses Plugin wird noch nicht verwendet, sondern nur definiert. Es ist das Skript [main.js], das es aktiviert:


// imports
import Vue from 'vue'
import App from './App.vue'
 
// plugins
import BootstrapVue from 'bootstrap-vue'
Vue.use(BootstrapVue);
 
// bootstrap
import 'bootstrap/dist/css/bootstrap.css'
import 'bootstrap-vue/dist/bootstrap-vue.css'
 
// eventbus
import eventBus from './event-bus';
import PluginEventBus from './plugins/event-bus';
Vue.use(PluginEventBus, eventBus);
 
// configuration
Vue.config.productionTip = false
 
// instanciation projet [App]
new Vue({
  render: h => h(App),
}).$mount('#app')

Kommentare

  • Die Zeilen 14–16 aktivieren das [PluginEventBus]-Plugin. Nach Zeile 16 verfügen alle Instanzen der [Vue]-Klasse (Funktion) über die Eigenschaft [$eventBus], die auf dasselbe Objekt verweist, das vom Skript [./event-bus.js] exportiert wird. Dies gilt für jede Komponente im Projekt;

11.3. Die Hauptansicht [App]

Die Hauptansicht [App] bleibt unverändert gegenüber dem vorherigen Projekt.

11.4. Die Komponente [Component1]

Die Komponente [Component1] nutzt nun ihre Eigenschaft [$eventBus], um auf das Ereignis [someEvent] zu warten:


<template>
  <b-row>
    <b-col>
      <b-alert show
               variant="warning"
               v-if="showMsg">Evénement [someEvent] intercepté par [Component1]. Valeur reçue={{data}}</b-alert>
    </b-col>
  </b-row>
</template>
 
<script>
  export default {
    name: "component1",
    // component status
    data() {
      return {
        data: "",
        showMsg: false
      };
    },
    // event management methods
    methods: {
      // evt management [someEvent]
      doSomething(data) {
        this.data = data;
        this.showMsg = true;
      }
    },
    // component lifecycle management
    // évt [created] - the component has been created
    created() {
      // listen to event [someEvent]
      this.$eventBus.$on("someEvent", this.doSomething);
    }
  };
</script>

Kommentare

  • Zeile 33, Verwendung der Eigenschaft [this.$eventBus] der Komponente. Beachten Sie außerdem, dass das Skript in Zeile 11 das Skript [./event-bus.js] nicht mehr importiert;

11.5. Die Komponente [Component2]

Die Komponente [Component2] verwendet nun ihre Eigenschaft [$eventBus], um das Ereignis [someEvent] auszulösen:


<template>
  <div>
    <b-button @click="createEvent">Créer un événement</b-button>
  </div>
</template>
<!-- script -->
<script>
  export default {
    name: "component2",
    // méthodes de gestion des évts
    methods: {
      createEvent() {
        this.$eventBus.$emit("someEvent", { x: 2, y: 4 })
      }
    }
  };
</script>

Kommentare

  • Zeile 13: Verwendung der Eigenschaft [this.$eventBus] der Komponente. Beachten Sie außerdem, dass das Skript in Zeile 7 das Skript [./event-bus.js] nicht mehr importiert;

11.6. Komponente [Component3]

Die Komponente [Component3] hat denselben Code wie [Component1]. Sie überwacht ebenfalls das Ereignis [someEvent].

11.7. Ausführen des Projekts

Image

Wir erhalten die gleichen Ergebnisse wie im vorherigen Projekt.