当前位置:首页 > 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)可简化跨层级通信。

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

相关文章

eventbus实现原理vue

eventbus实现原理vue

EventBus 的实现原理(Vue) EventBus 是 Vue 中实现跨组件通信的一种简单机制,其核心原理基于发布-订阅模式(Pub-Sub)。以下是其实现的关键点: 核心机制 事件中心 E…

react如何绑定事件

react如何绑定事件

React 事件绑定方法 在 React 中绑定事件有多种方式,以下是常见的几种方法: 使用 onClick 或其他事件属性直接绑定 <button onClick={() => co…

jquery添加事件

jquery添加事件

jQuery 添加事件的方法 jQuery 提供了多种方法来为元素添加事件监听。以下是一些常用的方式: 使用 .on() 方法 .on() 是 jQuery 中推荐的事件绑定方法,支持直接绑定和委托…

vue computed 实现原理

vue computed 实现原理

Vue Computed 实现原理 Vue 的 computed 属性是基于响应式依赖的缓存机制,其核心实现依赖于 Vue 的响应式系统和依赖收集机制。 依赖收集与缓存机制 computed 属性在…

vue checkbox实现原理

vue checkbox实现原理

Vue Checkbox 实现原理 Vue 中的 Checkbox 实现主要依赖于 v-model 指令,通过双向数据绑定将 checkbox 的选中状态与 Vue 实例的数据属性关联起来。 基本实…

vue框架实现原理

vue框架实现原理

Vue 框架实现原理 Vue.js 是一个渐进式 JavaScript 框架,其核心实现原理主要包括响应式系统、虚拟 DOM、模板编译和组件化机制。以下是其核心实现原理的详细解析: 响应式系统 Vu…