当前位置:首页 > VUE

vue $emit实现原理

2026-02-19 16:34:42VUE

Vue $emit 实现原理

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

事件注册与存储

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

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

$emit 方法内部逻辑

$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 $emit实现原理

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

相关文章

vue实现活动倒计时

vue实现活动倒计时

实现活动倒计时的基本思路 在Vue中实现活动倒计时通常需要获取当前时间与活动结束时间的差值,并将其转换为天、小时、分钟、秒的格式展示。通过定时器每秒更新显示的时间。 定义倒计时数据 在Vue组件的d…

vue组件实现

vue组件实现

Vue 组件实现基础 Vue 组件是 Vue.js 的核心特性之一,允许将 UI 拆分为独立、可复用的模块。组件的实现包括定义、注册、数据传递和生命周期管理等。 定义组件 组件可以通过单文件组件(…

vue实现帖子

vue实现帖子

Vue 实现帖子功能 使用 Vue 实现帖子功能需要结合前端框架和后端数据交互,以下是实现的关键步骤和代码示例。 帖子列表展示 创建帖子列表组件,使用 v-for 渲染帖子数据,通过 axios…

vue列表实现

vue列表实现

Vue 列表实现方法 使用 v-for 指令 v-for 是 Vue 中用于渲染列表的核心指令,基于数据源动态生成 DOM 元素。语法格式为 item in items 或 (item, index)…

vue实现批量

vue实现批量

Vue 实现批量操作的方法 在 Vue 中实现批量操作通常涉及选择多个项目并执行统一处理,例如批量删除、批量更新等。以下是几种常见实现方式: 表格多选批量操作 使用 el-table 配合复选框实现…

vue实现全屏

vue实现全屏

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