当前位置:首页 > VUE

vue中$on实现

2026-03-29 18:54:38VUE

在Vue中,$on 是事件监听的核心方法,用于自定义事件的订阅。以下是其实现原理和应用方式:

vue中$on实现

实现原理

Vue的事件系统基于发布-订阅模式,$on 方法将事件名和回调函数存储到实例内部的 _events 对象中(初始化时为空对象)。当事件触发时,通过 $emit 遍历执行对应事件名的回调队列。

vue中$on实现

Vue.prototype.$on = function (event, fn) {
  const vm = this;
  // 若事件名为数组,递归注册多个事件
  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;
};

基础用法

监听自定义事件,通常在父子组件通信或全局事件总线中使用:

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

// 父组件监听事件
this.$on('custom-event', (data) => {
  console.log('接收数据:', data);
});

事件总线模式

通过创建空的Vue实例作为中央事件总线:

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

// 组件A监听事件
bus.$on('event-name', handler);

// 组件B触发事件
bus.$emit('event-name', payload);

注意事项

  • 内存管理:手动监听的事件需在组件销毁时通过 $off 移除,避免内存泄漏。
  • 单次监听:使用 $once 可实现只触发一次的事件监听。
  • 响应式隔离:事件总线模式中的回调函数不会自动绑定组件上下文,需用箭头函数或 .bind(this)

与Vue3差异

Vue 3移除了 $on API,推荐使用 mitttiny-emitter 等第三方库实现事件总线功能。

标签: vueon
分享给朋友:

相关文章

vue实现图片轮播

vue实现图片轮播

使用 Swiper 实现图片轮播 安装 Swiper 依赖 npm install swiper 在 Vue 组件中引入 Swiper <template> <div cla…

vue实现全文检索

vue实现全文检索

Vue 实现全文检索的方法 客户端全文检索(适用于小型数据集) 使用 flexsearch 或 lunr.js 等轻量级库实现前端全文检索: import FlexSearch from 'flex…

vue 实现简单登陆

vue 实现简单登陆

以下是一个使用 Vue 3 实现的简单登录功能示例,包含表单验证和基础交互逻辑: 创建 Vue 组件 <template> <div class="login-containe…

vue实现展开与收起

vue实现展开与收起

Vue 实现展开与收起功能 在 Vue 中实现展开与收起功能可以通过多种方式完成,以下是一些常见的方法: 使用 v-show 或 v-if 控制显示 通过 Vue 的指令 v-show 或 v-if…

vue实现portal

vue实现portal

Vue 实现 Portal 功能 Portal 是一种将子节点渲染到父组件 DOM 层级之外的 DOM 节点的技术,常用于实现模态框、弹出层等需要脱离当前组件层级的场景。Vue 可以通过多种方式实现…

vue 实现modal

vue 实现modal

Vue 实现 Modal 的方法 使用 Vue 原生组件 通过 Vue 的组件系统可以轻松实现 Modal。创建一个可复用的 Modal 组件,通过 props 控制显示与隐藏。 <templ…