当前位置:首页 > 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.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 });
  }
}

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

// 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,频繁触发会导致性能问题。这种情况下建议使用防抖/节流:

vue中$on实现

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

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

标签: vueon
分享给朋友:

相关文章

vue实现bootstrap

vue实现bootstrap

Vue 中集成 Bootstrap 的方法 在 Vue 项目中集成 Bootstrap 可以通过以下方式实现,涵盖样式、组件和交互功能。 安装 Bootstrap 依赖 通过 npm 或 yarn…

vue 菜单实现

vue 菜单实现

Vue 菜单实现方法 在Vue中实现菜单功能可以通过多种方式完成,以下是几种常见的实现方法: 使用v-for动态生成菜单 通过数据驱动的方式动态渲染菜单项,适合菜单内容可能变化的场景: <t…

vue实现增删

vue实现增删

Vue 实现增删功能 在 Vue 中实现增删功能通常涉及数据绑定、事件处理和列表渲染。以下是基于 Vue 2 或 Vue 3 的实现方法: 数据定义 初始化一个数组用于存储列表数据,并在 Vue 实…

vue最佳实现

vue最佳实现

Vue 最佳实践 组件设计 组件应遵循单一职责原则,每个组件只负责一个功能模块。命名采用 PascalCase(如 UserProfile.vue),模板中使用 kebab-case(如 <us…

vue 实现循环

vue 实现循环

Vue 实现循环的方法 在 Vue 中,可以使用 v-for 指令来实现循环渲染列表数据。以下是几种常见的循环实现方式: 基本数组循环 <template> <ul>…

vscode实现vue高亮

vscode实现vue高亮

安装Vue官方扩展 在VSCode扩展商店中搜索并安装Volar,这是Vue团队推荐的官方插件,提供完整的Vue 3语言支持、语法高亮、智能提示等功能。安装后无需额外配置即可生效。 启用Volar的…