当前位置:首页 > VUE

vue $emit实现原理

2026-02-19 16:34:42VUE

Vue $emit 实现原理

Vue 的 $emit 方法用于触发父组件中定义的自定义事件,其核心实现依赖于 Vue 的事件系统和发布-订阅模式。

事件注册与存储

在 Vue 实例初始化过程中,组件会通过 _events 对象存储所有注册的事件监听器。当父组件通过 v-on@ 语法监听子组件的事件时,Vue 会将回调函数注册到子组件的 _events 对象中。

vue $emit实现原理

// 示例:父组件监听子组件事件
<child-component @custom-event="handleEvent" />

$emit 方法内部逻辑

$emit 方法的主要逻辑如下:

vue $emit实现原理

  1. _events 对象中获取对应事件名的回调函数列表。
  2. 遍历回调列表,依次执行每个回调函数。
  3. 支持传递参数,回调函数会接收到这些参数。
Vue.prototype.$emit = function (event) {
  const vm = this
  let cbs = vm._events[event]
  if (cbs) {
    const args = Array.prototype.slice.call(arguments, 1)
    for (let i = 0; i < cbs.length; i++) {
      cbs[i].apply(vm, args)
    }
  }
  return vm
}

事件派发流程

当子组件调用 this.$emit('custom-event', data) 时:

  1. Vue 查找当前实例的 _events 对象中是否存在 custom-event 的事件监听器。
  2. 如果存在,则遍历监听器列表,逐个调用回调函数并传入 data 参数。
  3. 父组件的 handleEvent 方法会被触发,从而实现父子组件通信。

源码中的关键点

在 Vue 源码中,$emit 的实现还包含以下细节:

  • 事件名支持驼峰命名和短横线命名的自动转换。
  • 允许通过 $on 方法手动注册事件监听器。
  • 事件监听器的存储和触发均基于 JavaScript 的原生事件机制,不依赖 DOM 事件系统。

这种设计使得 Vue 的事件系统轻量且高效,适用于组件间的解耦通信。

标签: 原理vue
分享给朋友:

相关文章

vue实现异步

vue实现异步

Vue 实现异步操作的常见方法 Vue 提供了多种方式来处理异步操作,包括数据获取、事件处理等场景。 使用 async/await 在 Vue 方法中可以直接使用 async/await 语法处理异…

vue实现计算

vue实现计算

Vue 实现计算的方法 在 Vue 中实现计算功能可以通过多种方式完成,主要包括计算属性(computed)、方法(methods)和侦听器(watch)。以下是具体的实现方法: 计算属性(Comp…

vue实现树形

vue实现树形

Vue 实现树形组件 在 Vue 中实现树形结构通常需要递归组件和动态数据绑定。以下是实现树形组件的几种常见方法。 递归组件实现 递归组件是 Vue 中实现树形结构的核心方法。通过组件调用自身,可以…

vue实现甘特图

vue实现甘特图

使用 Vue 实现甘特图 基于开源库(如 vue-ganttastic) 安装依赖库: npm install vue-ganttastic 示例代码: <template> &l…

vue 实现聊天

vue 实现聊天

使用 Vue 实现聊天功能 创建 Vue 项目并安装依赖 确保已安装 Vue CLI,通过以下命令创建新项目: vue create chat-app 进入项目目录后,安装必要的依赖(如 Socke…

vue实现spa

vue实现spa

Vue 实现 SPA(单页应用)的步骤 创建 Vue 项目 使用 Vue CLI 快速初始化一个 Vue 项目,确保安装了 Vue Router 作为路由管理工具。运行以下命令创建项目: vue c…