当前位置:首页 > VUE

vue中$on实现

2026-02-17 18:43:33VUE

在Vue中,$on是事件总线(Event Bus)模式的核心方法,用于监听自定义事件。以下是关于$on的实现和使用详解:

基本用法

$on方法用于监听一个自定义事件,接收两个参数:事件名称和回调函数。当事件被触发时,回调函数会执行。

// 创建事件总线(通常使用空的Vue实例)
const eventBus = new Vue();

// 监听事件
eventBus.$on('custom-event', (payload) => {
  console.log('事件触发,参数:', payload);
});

实现原理

Vue的事件系统基于发布-订阅模式,内部通过_events对象存储事件监听器:

vue中$on实现

Vue.prototype.$on = function (event, fn) {
  const vm = this;
  // 如果event是数组,递归监听每个事件
  if (Array.isArray(event)) {
    for (let i = 0; i < event.length; i++) {
      vm.$on(event[i], fn);
    }
  } else {
    // 将回调函数存入_events对象
    (vm._events[event] || (vm._events[event] = [])).push(fn);
  }
  return vm;
};

实际应用场景

组件间通信 父子组件通过事件总线通信,避免多层$emit传递:

// 父组件
mounted() {
  eventBus.$on('child-event', this.handleChildEvent);
}

// 子组件
methods: {
  triggerEvent() {
    eventBus.$emit('child-event', { data: 123 });
  }
}

全局状态通知 跨组件触发全局状态变化:

vue中$on实现

// A组件
eventBus.$on('user-login', this.refreshData);

// B组件(登录成功后)
eventBus.$emit('user-login', { user: newUser });

注意事项

事件监听会导致内存泄漏,需要在组件销毁时移除监听:

beforeDestroy() {
  eventBus.$off('custom-event', this.eventHandler);
}

对于Vue 3,推荐使用mitt等第三方库替代事件总线,因为Vue 3移除了$onAPI:

import mitt from 'mitt';
const emitter = mitt();
emitter.on('event', () => { /*...*/ });

性能优化

避免在高频事件(如滚动)中使用$on,频繁触发会导致性能问题。这种情况下建议使用防抖/节流:

eventBus.$on('scroll', _.throttle(this.handleScroll, 200));

以上内容涵盖了$on的核心实现、典型用法和注意事项,可根据实际需求选择适合的应用方式。

标签: vueon
分享给朋友:

相关文章

vue实现多个tab

vue实现多个tab

Vue 实现多个 Tab 的方法 使用动态组件切换 在 Vue 中可以通过动态组件 <component :is="currentTab"> 结合 v-for 和 v-bind 实现多个…

vue实现slider

vue实现slider

Vue 实现 Slider 组件 使用 Vue 实现 Slider 组件可以通过原生开发或借助第三方库。以下是两种常见方法: 原生实现 Slider 创建一个基础的 Slider 组件,通过 v-m…

vue实现报表

vue实现报表

vue实现报表的方法 使用Vue实现报表通常需要结合图表库或表格组件。以下是几种常见方法: 使用ECharts 安装ECharts库: npm install echarts vue-echart…

vue路由实现

vue路由实现

Vue 路由实现 Vue Router 是 Vue.js 的官方路由管理器,用于构建单页面应用(SPA)。以下是 Vue Router 的基本实现步骤和核心功能。 安装 Vue Router 通过…

vue实现mui

vue实现mui

使用 Vue 实现 MUI(Material-UI)风格的界面 Vue 本身不直接提供 MUI(Material Design)组件,但可以通过集成第三方库或手动实现来达到类似效果。以下是几种常见方法…

vue实现追加

vue实现追加

追加数据到数组或列表 在Vue中追加数据到数组或列表,可以通过push方法或concat方法实现。以下是几种常见的实现方式: 方法一:使用push方法 this.items.push(newIte…