Skip to content

9. projeto [vuejs-07]: propagação de eventos na hierarquia de componentes

A estrutura do diretório do projeto é a seguinte:

Image

9.1. O script principal [main.js]

O script principal [main.js] permanece inalterado.

9.2. O componente principal [App]

O código do componente [App] é o seguinte:


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

O componente [App] utiliza um novo componente [Component1] (linhas 7, 13, 17).

9.3. O componente [Component11]

O código para o componente [Component11] é o seguinte:


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

Comentários

  • linhas 1–3: o componente [Component11] contém apenas um botão que pode ser clicado. Quando clicado, o método [createEvent] nas linhas 11–14 é executado;
  • linha 13: cada instância [View] possui um método [$emit] que permite que um evento seja emitido:
    • o primeiro parâmetro é o nome do evento emitido;
    • o segundo parâmetro são os dados a associar a este evento;
    • o evento emitido percorre a hierarquia de componentes que contêm o componente [Component11]. Ele percorre a hierarquia até encontrar um componente capaz de o processar. Este processo começa com o componente pai de [Component11];

9.4. O componente [Component1]

O código para o componente [Component1] é o seguinte:


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

Representação visual

Image

Image

Comentários

  • linha 5: [Component1] é o pai de [Component11] e, por isso, pode «ouvir» (é esse o termo) os eventos emitidos por este componente. Sabemos que [Component11] pode emitir o evento [someEvent]. O atributo [@someEvent="doSomething"] indica que, se o evento [someEvent] emitido por [Component11] ocorrer, então o método [doSomething] na linha 33 deve ser executado;
  • linhas 9–11: uma mensagem exibida pelo método [doSomething]. A sua exibição é controlada pelo booleano [showMsg] na linha 28. O alerta exibe o atributo [data] da linha 27;
  • Linha 33: O método [doSomething], executado quando o evento [someEvent] ocorre (linha 5), recebe o [data] associado a este evento como parâmetro. Este parâmetro é atribuído ao atributo [data] na linha 27, que é exibido pela linha 11;
  • linha 37: definimos o atributo [showMsg] como [true] para exibir o alerta das linhas 9–11;

9.5. Executar o projeto

Image