当前位置:首页 > VUE

vue on 和 emit实现

2026-02-22 15:14:03VUE

Vue 中 $on$emit 的实现

$on$emit 是 Vue 中用于实现自定义事件的核心方法,常用于父子组件或兄弟组件间的通信。以下是具体实现方式:

使用 $emit 触发事件

在发送事件的组件中调用 $emit,传递事件名称和可选数据:

// 子组件或触发事件的组件
this.$emit('event-name', data);

使用 $on 监听事件

在接收事件的组件中调用 $on,监听事件并处理数据:

vue on 和 emit实现

// 父组件或监听事件的组件
this.$on('event-name', (data) => {
  console.log('Received data:', data);
});

父子组件通信示例

子组件 (ChildComponent.vue)
通过按钮点击触发事件:

<template>
  <button @click="sendData">Send Data</button>
</template>

<script>
export default {
  methods: {
    sendData() {
      this.$emit('data-sent', { message: 'Hello from child!' });
    }
  }
}
</script>

父组件 (ParentComponent.vue)
监听子组件事件并接收数据:

vue on 和 emit实现

<template>
  <child-component @data-sent="handleData"></child-component>
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  components: { ChildComponent },
  methods: {
    handleData(data) {
      console.log(data.message); // 输出: "Hello from child!"
    }
  }
}
</script>

非父子组件通信

通过创建一个空的 Vue 实例作为事件总线(Event Bus):

// event-bus.js
import Vue from 'vue';
export const EventBus = new Vue();

组件 A (触发事件)

import { EventBus } from './event-bus.js';
EventBus.$emit('global-event', { payload: 'Data' });

组件 B (监听事件)

import { EventBus } from './event-bus.js';
EventBus.$on('global-event', (data) => {
  console.log(data.payload); // 输出: "Data"
});

注意事项

  • 移除监听器:避免内存泄漏,在组件销毁前使用 $off 移除监听:
    EventBus.$off('global-event');
  • 作用域$on$emit 必须在同一 Vue 实例或事件总线上调用。
  • 替代方案:复杂场景建议使用 Vuex 或 Provide/Inject。

通过 $on$emit 可以灵活实现组件间的松耦合通信。

标签: vueon
分享给朋友:

相关文章

vue实现收起展开面板

vue实现收起展开面板

实现收起展开面板的方法 在Vue中实现收起展开面板功能可以通过多种方式完成,以下是几种常见的实现方法: 使用v-show或v-if控制显示隐藏 利用Vue的指令可以轻松实现面板的展开和收起:…

vue菜单实现

vue菜单实现

Vue 菜单实现方法 使用 Element UI 的菜单组件 Element UI 提供了现成的菜单组件,适合快速实现导航菜单。安装 Element UI 后,可以直接使用 el-menu 相关组件。…

vue实现switch

vue实现switch

Vue 实现 Switch 开关组件 在 Vue 中实现 Switch 开关组件可以通过自定义组件或使用现有 UI 库完成。以下是几种常见实现方式: 自定义 Switch 组件 创建一个基础 Sw…

vue实现slot

vue实现slot

Vue 中的 Slot 实现方法 Vue 的 slot 是一种内容分发机制,允许父组件向子组件插入内容。以下是几种常见的 Slot 实现方式: 默认 Slot 子组件通过 <slot>…

vue 实现分屏

vue 实现分屏

Vue 实现分屏的方法 使用 CSS Flexbox 或 Grid 布局 通过 CSS Flexbox 或 Grid 布局可以轻松实现分屏效果。在 Vue 组件中定义两个或多个区域,并使用 CSS 控…

vue实现网站

vue实现网站

Vue 实现网站的基本步骤 Vue.js 是一个渐进式 JavaScript 框架,适合构建现代化的单页应用(SPA)或动态网站。以下是使用 Vue 实现网站的基本方法。 初始化 Vue 项目 使用…