Skip to content

10. Projekt [vuejs-08]: Von der Komponentenhierarchie unabhängige Ereignisse, Lebenszyklus der Komponente

Das Projekt [vuejs-08] veranschaulicht, wie Komponenten, die nicht direkt in der Komponentenhierarchie miteinander verknüpft sind, dennoch über Ereignisse kommunizieren können. Die Verzeichnisstruktur des Projekts [vuejs-08] sieht wie folgt aus:

Image

10.1. Das Hauptskript [main.js]

Das Skript [main.js] bleibt unverändert gegenüber den vorherigen Beispielen.

10.2. Das Skript [event-bus.js]

Das Skript [event-bus.js] ist das Werkzeug, das wir zum Auslösen und Abhören von Ereignissen verwenden werden:


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

Das Skript [event-bus] erstellt einfach eine Instanz der Klasse [Vue] (Zeilen 1–2) und exportiert sie (Zeile 3). Die Klasse [Vue] verfügt über zwei Methoden zur Verarbeitung von Ereignissen:

  • [Vue].$emit(name, data): ermöglicht es Ihnen, ein Ereignis namens [name] auszulösen, das mit den Daten [data] verknüpft ist;
  • [Vue].$on(name, fn): ermöglicht es Ihnen, das Ereignis mit dem Namen [name] abzufangen und durch die Funktion [fn] verarbeiten zu lassen. Die Funktion [fn] erhält die mit dem Ereignis verbundenen Daten [data] von ihrem Emitter als Parameter;

Diese Ereignisbehandlung ist nicht an die Komponentenhierarchie gebunden. Komponenten, die auf diese Weise kommunizieren möchten, müssen lediglich dieselbe Instanz der Klasse [View] verwenden, um Ereignisse auszulösen bzw. auf sie zu warten. In unserem Beispiel verwenden wir die Instanz [eventBus], die im vorherigen Skript [event-bus.js] definiert wurde.

10.3. Die Hauptansicht [App.vue]

Der Code für die Hauptansicht [App] lautet wie folgt:


<template>
  <div class="container">
    <b-card>
      <b-alert show variant="success" align="center">
        <h4>[vuejs-08] : événements indépendants de la hiérarchie des composants, cycle de vie des composants</h4>
      </b-alert>
      <!-- les trois composants qui communiquent par évt -->
      <Component1 />
      <Component3 />
      <Component2 />
    </b-card>
  </div>
</template>
 
<script>
  import Component1 from "./components/Component1";
  import Component2 from "./components/Component2";
  import Component3 from "./components/Component3";
  export default {
    name: "app",
    // composants
    components: {
      Component1,
      Component2,
      Component3
    }
  };
</script>
  • Zeilen 8–10: Die Hauptansicht [App] verwendet drei Komponenten [Component1, Component2, Component3], die über Ereignisse kommunizieren. Die drei Komponenten befinden sich innerhalb der Ansicht [App] auf derselben Ebene. Außerdem besteht keine hierarchische Beziehung zwischen ihnen;

10.4. Die Komponente [Component1]

Der Code für die Komponente [Component1] lautet wie folgt:


<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>
  import eventBus from "../event-bus.js"
  export default {
    name: "component1",
    // état du composant
    data() {
      return {
        data: "",
        showMsg: false
      };
    },
    // méthodes de gestion des évts
    methods: {
      // gestion de l'evt [someEvent]
      doSomething(data) {
        this.data = data;
        this.showMsg = true;
      }
    },
    // gestion du cycle de vie du composant
    // évt [created] - le composant a été créé
    created() {
      // écoute de l'évt [someEvent]
      eventBus.$on("someEvent", this.doSomething);
    }
  };
</script>

Kommentare

  • Zeilen 4–6: Eine Warnmeldung, die die Daten [data] aus Zeile 18 anzeigt. Diese Daten werden durch den Ereignishandler [doSomething] in Zeile 25 initialisiert. Dieser Handler wird beim Empfang des Ereignisses [someEvent] (Zeile 34) ausgelöst. Die Meldung wird basierend auf dem Wert des Attributs [showMsg] in Zeile 19 angezeigt. Dieses Attribut wird ebenfalls vom Ereignisbehandler [doSomething] in Zeile 25 gesetzt;
  • Zeile 32: Die Funktion [created] ist ein Ereignisbehandler. Sie verarbeitet das Ereignis [created], das während des Lebenszyklus der Komponente ausgelöst wird. Es gibt weitere Ereignisse [beforeCreate, created, beforeMount, mounted, beforeUpdate, updated, beforeDestroy, destroyed]. Das Ereignis [created] wird ausgelöst, wenn die Komponente erstellt wurde;
  • Zeile 12: Die Instanz [eventBus] der Klasse [Vue] wird importiert;
  • Zeile 34: Sie wird verwendet, um auf das [someEvent]-Ereignis zu warten. Wenn dieses Ereignis eintritt, wird die Methode [doSomething] in Zeile 25 aufgerufen;
  • Zeile 25: Die Methode [doSomething] erhält die Daten, die der Auslöser des Ereignisses [someEvent] mit dem Ereignis verknüpft hat, als Parameter [data];
  • Zeilen 26–27: Der Zustand der Komponente wird aktualisiert, sodass die Warnmeldung in den Zeilen 4–6 die empfangenen Daten anzeigt;

10.5. Die Komponente [Component2]

Die Komponente [Component2] sieht wie folgt aus:


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

Kommentare

  • Zeile 3: eine Schaltfläche zum Erstellen eines Ereignisses. Wenn der Benutzer auf diese Schaltfläche klickt, wird die Methode [createEvent] in Zeile 13 aufgerufen;
  • Zeile 8: Die durch das Skript [event-bus.js] definierte Instanz [eventBus] wird importiert;
  • Zeile 14: Diese Instanz wird verwendet, um ein Ereignis namens [someEvent] auszulösen, das mit den Daten [{ x: 2, y: 4 }] verknüpft ist. Wenn der Benutzer schließlich auf die Schaltfläche in Zeile 3 klickt, wird das Ereignis [someEvent] ausgelöst. Wenn wir uns an die Definition von [Component1] erinnern, wird dieses Ereignis abgefangen;

10.6. Die Komponente [Component3]

Der Code für diese Komponente lautet wie folgt:


<template>
  <b-row>
    <b-col>
      <b-alert show
               v-if="showMsg">Evénement [someEvent] intercepté par [Component3]. Valeur reçue={{data}}</b-alert>
    </b-col>
  </b-row>
</template>
 
<script>
  import eventBus from "../event-bus.js"
  export default {
    name: "component3",
    // état du composant
    data() {
      return {
        data: "",
        showMsg: false
      };
    },
    methods: {
      // gestion de l'evt [someEvent]
      doSomething(data) {
        this.data = data;
        this.showMsg = true;
      }
    },
    // gestion du cycle de vie du composant
    // évt [created] - le composant a été créé
    created() {
      // écoute de l'évt [someEvent]
      eventBus.$on("someEvent", this.doSomething);
    }
  };
</script>

[Component3] ist ein Klon von [Component1]. Es dient lediglich dazu, zu veranschaulichen, dass ein Ereignis von mehreren Komponenten abgefangen werden kann.

10.7. Ausführen des Projekts [vuejs-08]

Image

Image

Image