Skip to content

9. Projekt [vuejs-07]: Ereignisausbreitung in der Komponentenhierarchie

Die Verzeichnisstruktur des Projekts sieht wie folgt aus:

Image

9.1. Das Hauptskript [main.js]

Das Hauptskript [main.js] bleibt unverändert.

9.2. Die Hauptkomponente [App]

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


<template>
  <div class="container">
    <b-card>
      <b-alert show variant="success" align="center">
        <h4>[vuejs-07] : remontée d'événements dans la hiérarchie des composants</h4>
      </b-alert>
      <Component1 />
    </b-card>
  </div>
</template>
 
<script>
  import Component1 from './components/Component1'
  export default {
    name: "app",
    components: {
      Component1
    }
  };
</script>

Die Komponente [App] verwendet eine neue Komponente [Component1] (Zeilen 7, 13, 17).

9.3. Die Komponente [Component11]

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


<template>
  <b-button @click="createEvent">Créer un événement</b-button>
</template>
<!-- script -->
<script>
  export default {
    name: "component11",
    // component methods
    methods: {
      // event management [click] on button
      createEvent() {
        // we send an event coupled to data
        this.$emit("someEvent", { x: 2, y: 4 })
      }
    }
  };
</script>

Kommentare

  • Zeilen 1–3: Die Komponente [Component11] enthält nur eine Schaltfläche, auf die geklickt werden kann. Beim Klicken wird die Methode [createEvent] in den Zeilen 11–14 ausgeführt;
  • Zeile 13: Jede [View]-Instanz verfügt über eine [$emit]-Methode, mit der ein Ereignis ausgelöst werden kann:
    • Der erste Parameter ist der Name des ausgelösten Ereignisses;
    • der zweite Parameter sind die Daten, die diesem Ereignis zugeordnet werden sollen;
    • Das ausgelöste Ereignis wandert die Hierarchie der Komponenten hinauf, die die Komponente [Component11] enthalten. Es wandert so lange die Hierarchie hinauf, bis es eine Komponente findet, die es verarbeiten kann. Dieser Prozess beginnt mit der übergeordneten Komponente von [Component11];

9.4. Die Komponente [Component1]

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


<template>
  <b-row>
    <!-- le composant qui lance l'événement -->
    <b-col cols="2">
      <Component11 @someEvent="doSomething" />
    </b-col>
    <!-- message affiché par la méthode de gestion de l'évt-->
    <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 Component11 from "./Component11";
  export default {
    name: "component1",
    // composants
    components: {
      Component11
    },
    // état du composant
    data() {
      return {
        data: "",
        showMsg: false
      };
    },
    // méthodes de gestion des évts
    methods: {
      doSomething(data) {
        // data est l'objet qui a été associé à l'évt [someEvent]
        this.data = data;
        // affiche l'alerte
        this.showMsg = true;
      }
    }
  };
</script>

Visuelle Darstellung

Image

Image

Kommentare

  • Zeile 5: [Component1] ist der übergeordnete Bestandteil von [Component11] und kann daher auf Ereignisse „hören“ (so lautet der Fachbegriff), die von dieser Komponente ausgelöst werden. Wir wissen, dass [Component11] das Ereignis [someEvent] auslösen kann. Das Attribut [@someEvent="doSomething"] gibt an, dass bei Auftreten des von [Component11] ausgelösten Ereignisses [someEvent] die Methode [doSomething] in Zeile 33 ausgeführt werden muss;
  • Zeilen 9–11: Eine von der Methode [doSomething] angezeigte Meldung. Ihre Anzeige wird durch den booleschen Wert [showMsg] in Zeile 28 gesteuert. Die Meldung zeigt das Attribut [data] aus Zeile 27 an;
  • Zeile 33: Die Methode [doSomething], die ausgeführt wird, wenn das Ereignis [someEvent] eintritt (Zeile 5), erhält die mit diesem Ereignis verbundenen [data] als Parameter. Dieser Parameter wird dem Attribut [data] in Zeile 27 zugewiesen, das in Zeile 11 angezeigt wird;
  • Zeile 37: Wir setzen das Attribut [showMsg] auf [true], um die Warnmeldung aus den Zeilen 9–11 anzuzeigen;

9.5. Ausführen des Projekts

Image