当前位置:首页 > 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 实例作为事件中心:

    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事件传递实现原理

    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 监听一次后自动移除:

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

总结

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

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

相关文章

css制作图文混排原理

css制作图文混排原理

CSS 图文混排原理 图文混排主要通过 CSS 的浮动、定位、弹性布局或网格布局实现,核心是控制文本与图片的相对位置和环绕效果。 浮动(Float)实现环绕 使用 float 属性让图片浮动到左侧或…

jquery事件

jquery事件

jQuery 事件基础 jQuery 提供了一套简化的事件处理机制,允许开发者通过简洁的语法绑定、触发和管理事件。核心方法包括 on()、off()、trigger() 等,支持常见事件(如点击、悬停…

vue模版实现原理

vue模版实现原理

Vue 模板实现原理 Vue 的模板实现主要基于编译和虚拟 DOM 技术,将模板转换为可执行的渲染函数。以下是其核心实现原理: 模板编译过程 Vue 模板通过编译器将 HTML 模板字符串转换为渲…

vue实现tap事件

vue实现tap事件

Vue 中实现 Tap 事件的方法 在 Vue 中实现类似移动端的 tap 事件(轻触),可以通过原生事件或第三方库实现。以下是几种常见方法: 使用 @click 模拟 Tap 事件 移动端浏览器通…

vue框架实现原理

vue框架实现原理

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

vue nextick实现原理

vue nextick实现原理

Vue nextTick 实现原理 Vue 的 nextTick 是一个用于在 DOM 更新完成后执行回调的 API。其核心原理基于 JavaScript 的事件循环机制,确保回调在 DOM 更新后的…