当前位置:首页 > VUE

Vue事件传递实现原理

2026-01-22 16:50:44VUE

Vue 事件传递的实现原理

Vue 的事件传递主要通过 $emit$on 方法实现,基于发布-订阅模式。子组件通过 $emit 触发事件,父组件通过 v-on@ 监听事件,从而实现父子组件间的通信。

核心机制

  1. $emit 触发事件
    子组件调用 this.$emit(eventName, ...args) 触发自定义事件。eventName 是事件名称,args 是传递给父组件的参数。

  2. $on 监听事件
    父组件通过 v-on:eventName="handler"@eventName="handler" 监听子组件触发的事件。handler 是父组件中定义的回调函数。

  3. 事件中心(Event Bus)
    跨组件通信时,可以创建一个空的 Vue 实例作为事件中心:

    const eventBus = new Vue();
    // 组件A发送事件
    eventBus.$emit('event-name', data);
    // 组件B监听事件
    eventBus.$on('event-name', (data) => {});

源码解析

Vue 的事件系统在 src/core/instance/events.js 中实现,核心逻辑如下:

  1. 事件注册
    $on 方法将回调函数存入 _events 对象,键为事件名,值为回调函数数组:

    Vue.prototype.$on = function (event, fn) {
      const vm = this;
      (vm._events[event] || (vm._events[event] = [])).push(fn);
      return vm;
    };
  2. 事件触发
    $emit 方法遍历 _events 中对应事件名的回调函数并执行:

    Vue.prototype.$emit = function (event) {
      const vm = this;
      let cbs = vm._events[event];
      if (cbs) {
        const args = [...arguments].slice(1);
        for (let i = 0; i < cbs.length; i++) {
          cbs[i].apply(vm, args);
        }
      }
      return vm;
    };

注意事项

  • 事件命名规范
    推荐使用 kebab-case(如 my-event),因为 HTML 属性大小写不敏感。

  • 移除事件监听
    通过 $off 移除事件监听,避免内存泄漏:

    // 移除特定事件的所有监听
    this.$off('event-name');
    // 移除特定回调
    this.$off('event-name', callback);
  • 一次性监听
    使用 $once 监听一次后自动移除:

    Vue事件传递实现原理

    this.$once('event-name', callback);

总结

Vue 的事件传递基于发布-订阅模式,通过 $emit$on 实现组件通信。源码中通过 _events 对象管理事件回调,适用于父子组件或任意组件间的消息传递。合理使用事件中心(Event Bus)可简化跨层级通信。

标签: 原理事件
分享给朋友:

相关文章

vue实现全屏事件

vue实现全屏事件

Vue 实现全屏事件的方法 在 Vue 中实现全屏功能可以通过浏览器提供的 Fullscreen API 来实现。以下是几种常见的实现方式: 使用原生 Fullscreen API 通过调用 Ele…

vue事件实现原理

vue事件实现原理

Vue 事件实现原理 Vue 的事件系统基于发布-订阅模式,通过 $on、$emit 等方法实现组件间通信。以下是核心实现原理的分解: 事件注册与存储 Vue 实例内部通过 _events 对象存储…

vue核心实现原理

vue核心实现原理

Vue 核心实现原理 Vue.js 的核心实现原理主要围绕响应式系统、虚拟 DOM 和模板编译展开。以下是关键实现机制: 响应式系统 Vue 通过 Object.defineProperty(Vue…

react vue 实现原理

react vue 实现原理

React 实现原理 React 的核心思想是基于虚拟 DOM(Virtual DOM)和组件化开发。虚拟 DOM 是一个轻量级的 JavaScript 对象,用于描述真实 DOM 的结构。React…

vue实现事件代理

vue实现事件代理

事件代理的概念 事件代理(Event Delegation)是一种利用事件冒泡机制,将子元素的事件委托给父元素统一处理的技术。在Vue中,可以通过v-on指令或$on方法实现事件代理,减少事件监听器的…

vue watch 实现原理

vue watch 实现原理

Vue Watch 实现原理 Vue 的 watch 功能用于监听数据变化并执行回调函数。其核心原理基于 Vue 的响应式系统,通过依赖收集和触发更新机制实现。 依赖收集 在 Vue 的响应式系统中…