Skip to content

9. Projekt [vuejs-07]: przekazywanie zdarzeń w hierarchii komponentów

Struktura drzewa projektu wygląda następująco:

Image

9.1. Główny skrypt [main.js]

Główny skrypt [main.js] pozostaje bez zmian.

9.2. Główny komponent [App]

Kod komponentu [App] jest następujący:


<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>

Komponent [App] wykorzystuje nowy komponent [Component1] (wiersze 7, 13, 17).

9.3. Komponent [Component11]

Kod komponentu [Component11] jest następujący:


<template>
  <b-button @click="createEvent">Créer un événement</b-button>
</template>
<!-- skrypt -->
<script>
  export default {
    name: "component11",
    // metody komponentu
    methods: {
      // obsługa zdarzenia [click] na przycisku
      createEvent() {
        // wysyłane jest zdarzenie powiązane z danymi
        this.$emit("someEvent", { x: 2, y: 4 })
      }
    }
  };
</script>

Uwagi

  • wiersze 1–3: komponent [Component11] zawiera tylko jeden przycisk, który można kliknąć. Po kliknięciu uruchamiana jest metoda [createEvent] z wierszy 11–14;
  • wiersz 13: każda instancja [Vue] posiada metodę [$emit], która umożliwia wygenerowanie zdarzenia:
    • pierwszym parametrem jest nazwa generowanego zdarzenia;
    • drugim parametrem są dane, które chcemy powiązać z tym zdarzeniem;
    • wysłane zdarzenie przechodzi w górę hierarchii komponentów nadrzędnych względem komponentu [Component11]. Przechodzi w górę hierarchii, aż znajdzie komponent gotowy do jego przetworzenia. Proces ten rozpoczyna się od komponentu nadrzędnego względem [Component11];

9.4. Komponent [Component1]

Kod komponentu [Component1] jest następujący:


<template>
  <b-row>
    <!-- komponent, który wyzwala zdarzenie -->
    <b-col cols="2">
      <Component11 @someEvent="doSomething" />
    </b-col>
    <!-- komunikat wyświetlany przez metodę obsługi zdarzenia-->
    <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",
    // komponenty
    components: {
      Component11
    },
    // stan komponentu
    data() {
      return {
        data: "",
        showMsg: false
      };
    },
    // metody obsługi zdarzeń
    methods: {
      doSomething(data) {
        // data to obiekt powiązany z zdarzeniem [someEvent]
        this.data = data;
        // wyświetla alert
        this.showMsg = true;
      }
    }
  };
</script>

Wygląd

Image

Image

Komentarze

  • wiersz 5: [Component1] jest elementem nadrzędnym względem [Component11] i w związku z tym może „nasłuchiwać” (tak brzmi termin) zdarzeń generowanych przez ten komponent. Wiadomo, że komponent ten może generować zdarzenie [someEvent]. Atrybut [@someEvent="doSomething"] wskazuje, że jeśli wystąpi zdarzenie [someEvent] wysłane przez [Component11], wówczas należy wykonać metodę [doSomething] z wiersza 33;
  • wiersze 9–11: komunikat wyświetlany przez metodę [doSomething]. Jego wyświetlenie jest kontrolowane przez zmienną logiczną [showMsg] z wiersza 28. Komunikat wyświetla atrybut [data] z wiersza 27;
  • wiersz 33: metoda [doSomething], wykonywana po wystąpieniu zdarzenia [someEvent] (wiersz 5), otrzymuje jako parametr wartość [data] powiązaną z tym zdarzeniem. Parametr ten jest przypisywany do atrybutu [data] w wierszu 27, który jest wyświetlany przez wiersz 11;
  • wiersz 37: przypisujemy atrybut [showMsg] do wartości [true], aby wyświetlić alert dotyczący wierszy 9–11;

9.5. Wykonanie projektu

Image