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>
  export default {
    name: "component11",
    // 组件方法
    methods: {
      // 管理按钮上的 [click] 事件
      createEvent() {
        // 触发与数据关联的事件
        this.$emit("someEvent", { x: 2, y: 4 })
      }
    }
  };
</script>

注释

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

9.4. 组件 [Component1]

[Component1] 组件的代码如下:


<template>
  <b-row>
    <!-- 触发事件的组件 -->
    <b-col cols="2">
      <Component11 @someEvent="doSomething" />
    </b-col>
    <!-- 事件处理方法显示的消息-->
    <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",
    // 组件
    components: {
      Component11
    },
    // 组件状态
    data() {
      return {
        data: "",
        showMsg: false
      };
    },
    // 事件处理方法
    methods: {
      doSomething(data) {
        // data 是与事件 [someEvent] 关联的对象
        this.data = data;
        // 显示警报
        this.showMsg = true;
      }
    }
  };
</script>

视觉呈现

Image

Image

注释

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

9.5. 项目执行

Image