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

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

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

vue中$on实现

标签: vueon
分享给朋友:

相关文章

vue拖拽实现

vue拖拽实现

Vue 拖拽实现方法 使用 HTML5 原生拖拽 API HTML5 提供了原生拖拽 API,可以通过 draggable 属性、dragstart、dragend、dragover 和 drop 事…

vue实现购票

vue实现购票

Vue 实现购票功能 数据结构设计 购票功能通常需要以下数据结构: 场次信息(时间、地点、价格) 座位信息(可选座位、已售座位) 用户订单信息 示例数据结构: data() { retur…

vue 实现工具

vue 实现工具

Vue 实现工具的方法 使用 Vue 实现工具功能可以通过多种方式完成,具体取决于工具的类型和需求。以下是几种常见的方法: 组件化实现 创建一个独立的 Vue 组件来封装工具功能。例如,实现一…

利用vue 实现

利用vue 实现

以下是利用 Vue 实现常见功能的几种方法,分为不同场景和技术要点: 数据绑定与响应式更新 Vue 的核心特性是数据绑定,通过 v-model 实现双向绑定: <template>…

vue多选实现

vue多选实现

Vue 多选实现方法 基础实现(v-model + multiple) 在 Vue 中实现多选可以通过 <select> 元素的 multiple 属性结合 v-model 完成。v-mo…

vue实现slidetoggle

vue实现slidetoggle

Vue 实现 SlideToggle 效果 SlideToggle 是一种常见的交互效果,元素以滑动方式展开或收起。以下是几种实现方法: 使用 CSS Transition 和 v-show…