Skip to content

9. Progetto [vuejs-07]: risalita degli eventi nella gerarchia dei componenti

L’albero del progetto è il seguente:

Image

9.1. Lo script principale [main.js]

Lo script principale [main.js] rimane invariato.

9.2. Il componente principale [App]

Il codice del componente [App] è il seguente:


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

Il componente [App] utilizza un nuovo componente [Component1] (righe 7, 13, 17).

9.3. Il componente [Component11]

Il codice del componente [Component11] è il seguente:


<template>
  <b-button @click="createEvent">Créer un événement</b-button>
</template>
<!-- script -->
<script>
  export default {
    name: "component11",
    // metodi del componente
    methods: {
      // gestione dell'evento [click] sul pulsante
      createEvent() {
        // viene generato un evento associato a un dato
        this.$emit("someEvent", { x: 2, y: 4 })
      }
    }
  };
</script>

Commenti

  • righe 1-3: il componente [Component11] presenta un solo pulsante su cui è possibile cliccare. Quando si clicca su di esso, viene eseguito il metodo [createEvent] delle righe 11-14;
  • riga 13: ogni istanza [Vue] dispone di un metodo [$emit] che consente di emettere un evento:
    • il primo parametro è il nome dell’evento generato;
    • il secondo parametro è il dato che si desidera associare a tale evento;
    • l’evento generato risale la gerarchia dei componenti che sovrastano il componente [Component11]. Risale la gerarchia fino a quando non trova un componente in grado di elaborarlo. Questa risalita inizia dal componente padre di [Component11];

9.4. Il componente [Component1]

Il codice del componente [Component1] è il seguente:


<template>
  <b-row>
    <!-- il componente che genera l'evento -->
    <b-col cols="2">
      <Component11 @someEvent="doSomething" />
    </b-col>
    <!-- messaggio visualizzato dal metodo di gestione dell'evento-->
    <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",
    // componenti
    components: {
      Component11
    },
    // stato del componente
    data() {
      return {
        data: "",
        showMsg: false
      };
    },
    // metodi di gestione degli eventi
    methods: {
      doSomething(data) {
        // data è l'oggetto che è stato associato all'evento [someEvent]
        this.data = data;
        // visualizza l'avviso
        this.showMsg = true;
      }
    }
  };
</script>

Visualizzazione

Image

Image

Commenti

  • riga 5: [Component1] è il componente padre di [Component11] e può quindi “ascoltare” (è questo il termine) gli eventi emessi da tale componente. Si sa che quest’ultimo può emettere l’evento [someEvent]. L’attributo [@someEvent="doSomething"] indica che, se si verifica l’evento [someEvent] emesso da [Component11], allora deve essere eseguito il metodo [doSomething] della riga 33;
  • righe 9-11: un messaggio visualizzato dal metodo [doSomething]. La sua visualizzazione è controllata dalla variabile booleana [showMsg] alla riga 28. L’avviso visualizza l’attributo [data] alla riga 27;
  • riga 33: il metodo [doSomething], eseguito quando si verifica l’evento [someEvent] (riga 5), riceve come parametro il dato [data] associato a tale evento. Questo parametro viene assegnato all’attributo [data] della riga 27, visualizzato dalla riga 11;
  • riga 37: si imposta l’attributo [showMsg] su [true] per visualizzare l’avviso delle righe 9-11;

9.5. Esecuzione del progetto

Image