Skip to content

9. 项目 [vuejs-07]:组件层级中的事件传播

项目目录结构如下:

Image

9.1. 主脚本 [main.js]

主脚本 [main.js] 保持不变。

9.2. 主组件 [App]

[App] 组件的代码如下:


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

[App] 组件使用了一个新的 [Component1] 组件(第 7、13、17 行)。

9.3. [Component11] 组件

[Component11] 组件的代码如下:


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

评论

  • 第 1–3 行:[Component11] 组件仅包含一个可点击的按钮。点击后,将执行第 11–14 行中的 [createEvent] 方法;
  • 第 13 行:每个 [View] 实例都拥有一个 [$emit] 方法,用于触发事件:
    • 第一个参数是事件的名称;
    • 第二个参数是与该事件关联的数据;
    • 发出的事件会沿着包含 [Component11] 组件的组件层次结构向上传播。它会向上传播,直到找到能够处理该事件的组件。此过程从 [Component11] 的父组件开始;

9.4. [Component1] 组件

[Component1] 组件的代码如下:


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

可视化渲染

Image

Image

评论

  • 第 5 行:[Component1] [Component11] 的父组件,因此可以“监听”(这是专业术语)该组件发出的事件。 我们知道 [Component11] 可以触发 [someEvent] 事件。属性 [@someEvent="doSomething"] 表示,如果 [Component11] 触发的 [someEvent] 事件发生,则必须执行第 33 行中的 [doSomething] 方法;
  • 第 9–11 行:由 [doSomething] 方法显示的一条消息。其显示由第 28 行的布尔变量 [showMsg] 控制。该提示框显示第 27 行中的 [data] 属性;
  • 第 33 行:[doSomething] 方法在 [someEvent] 事件发生时(第 5 行)被执行,并接收与该事件关联的 [data] 作为参数。该参数被赋值给第 27 行的 [data] 属性,该属性由第 11 行进行显示;
  • 第 37 行:我们将 [showMsg] 属性设置为 [true],以显示第 9–11 行中的提示框;

9.5. 运行项目

Image