Skip to content

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

Das Projekt [vuejs-09] ist identisch mit dem Projekt [vuejs-08], mit dem Unterschied, dass es das Konzept des Plugins einführt. Die Projektstruktur 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) {
    // Fügt der Klasse „Vue“ die Eigenschaft [$eventBus] hinzu
    Object.defineProperty(Vue.prototype, '$eventBus', {
      // Wenn auf „Vue.$eventBus“ verwiesen wird, wird der zweite Parameter „[eventBus]“ zurückgegeben
      get: () => eventBus,
    })
  }
}

Kommentare

  • Ein Plugin [Vue] ist ein Objekt mit einer Funktion [install] (Zeile 2). Diese wird automatisch aufgerufen, wenn in einem Code die Verwendung des Plugins deklariert wird;
  • Zeilen 1–9: Das vom Skript exportierte Objekt;
  • Zeile 2: Die Funktion [install] akzeptiert hier zwei Parameter:
    • [Vue]: die durch die Anweisung [import Vue from ‘Vue’] erzeugte Funktion. Kann mit einer Klasse verglichen werden;
    • [eventBus]: das vom Skript [./event-bus] exportierte Objekt;
  • Zeilen 4–7: Ändern die Definition (man spricht vom Prototyp) der Funktion [Vue], indem sie die Eigenschaft [$eventBus] hinzufügen. Bezieht man sich auf den Begriff [classe], wird die Eigenschaft [$eventBus] der Klasse [Vue] hinzugefügt. Komponenten, die Instanzen von [Vue] sind, haben somit Zugriff auf diese neue Eigenschaft;
  • Zeile 6 gibt an, dass beim Verweisen auf die Eigenschaft [Vue].$eventBus der Parameter [eventBus] aus Zeile 2 zurückgegeben wird. Wir werden etwas später sehen, dass dieser zweite Parameter das Objekt [eventBus] ist, das vom Skript [./event-bus.js] exportiert wird. Wenn also letztendlich eine C-Komponente den Ausdruck [C.$eventBus] verwendet, verweist sie auf das Objekt [eventBus], das vom Skript [./event-bus.js] exportiert wurde. Dadurch wird vermieden, dass das Skript [./event-bus.js] importiert werden muss. Darin liegt der Vorteil des Plugins: Es vereinfacht den Zugriff auf das Objekt [eventBus], das vom Skript [./event-bus.js] exportiert wird;
  • Es sei angemerkt, dass das Plugin nicht unbedingt selbst [event-bus.js] heißen muss. Man hätte es beispielsweise auch [plugin-event-bus] nennen können;
  • Es sei außerdem angemerkt, dass das Zeichen $ in [$eventBus] eine Konvention ist, um die Eigenschaften von [Vue] zu kennzeichnen, die über Plugins hinzugefügt wurden. Diese Konvention muss nicht unbedingt befolgt werden. In diesem Text werden wir sie jedoch befolgen;

11.2. Das Hauptskript [main.js]

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


// Importe
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);

// Konfiguration
Vue.config.productionTip = false

// Projektinstanziierung [App]
new Vue({
  render: h => h(App),
}).$mount('#App')

Kommentare

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

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 das Ereignis [someEvent] abzufangen:


<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",
    // Komponentenstatus
    data() {
      return {
        data: "",
        showMsg: false
      };
    },
    // Methoden zur Ereignisverwaltung
    methods: {
      // Ereignisverwaltung [someEvent]
      doSomething(data) {
        this.data = data;
        this.showMsg = true;
      }
    },
    // Lebenszyklusverwaltung der Komponente
    // Ereignis [created] – Die Komponente wurde erstellt
    created() {
      // Abhören des Ereignisses [someEvent]
      this.$eventBus.$on("someEvent", this.doSomething);
    }
  };
</script>

Anmerkungen

  • Zeile 33: Verwendung der Eigenschaft [this.$eventBus] der Komponente. Außerdem ist zu beachten, 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>
<!-- Skript -->
<script>
  export default {
    name: "component2",
    // Methoden zur Ereignisverwaltung
    methods: {
      createEvent() {
        this.$eventBus.$emit("someEvent", { x: 2, y: 4 })
      }
    }
  };
</script>

Anmerkungen

  • Zeile 13: Verwendung der Eigenschaft [this.$eventBus] der Komponente. Außerdem ist zu beachten, 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]. Auch sie überwacht das Ereignis [someEvent].

11.7. Ausführung des Projekts

Image

Man erhält dieselben Ergebnisse wie im vorherigen Projekt.