当前位置: 首页 > news >正文

Vue3组件通信 emit 的工作原理

文章目录

  • 前言
    • 🔧 使用方式简述
    • ⚙️ 源码角度解析 `emit`
      • 一、组件实例初始化时的 `emit`
      • 二、emit 函数的定义
      • 三、关键点说明
    • 🧠 总结流程图(简化)
    • 🔍 结合运行时举个实际例子
    • 📌 总结


前言

Vue 3 中 emit 是组件之间通信的重要机制,通常用于 子组件向父组件发送事件。下面我们结合源码,深入理解 emit 的工作原理。


🔧 使用方式简述

子组件中:

defineProps(['msg'])
const emit = defineEmits(['change'])function triggerChange() {emit('change', 'new value')
}

父组件中:

<MyComponent @change="onChange" />

⚙️ 源码角度解析 emit

Vue 3 中的 emit 是在 组件实例 (ComponentInternalInstance) 的上下文中定义的函数。它的实现主要在 Vue 3 的核心包 @vue/runtime-core 中。

一、组件实例初始化时的 emit

位于:packages/runtime-core/src/component.ts

export function createComponentInstance(...) {const instance: ComponentInternalInstance = {...emit: (...args) => {emit(instance, ...args)}}...
}

这里 emit 是一个闭包,它绑定了当前组件实例,最终调用了 emit(instance, ...args) 这个方法。


二、emit 函数的定义

位于:packages/runtime-core/src/componentEmits.ts

export function emit(instance: ComponentInternalInstance,event: string,...rawArgs: unknown[]
) {const props = instance.vnode.props || EMPTY_OBJlet handlerName = toHandlerKey(event) // 比如 'change' => 'onChange'let handler = props[handlerName]if (!handler && event.toLowerCase() !== event) {handler = props[handlerName.toLowerCase()]}if (handler) {callWithAsyncErrorHandling(handler, instance, ErrorCodes.COMPONENT_EVENT_HANDLER, args)}
}

三、关键点说明

步骤内容
toHandlerKey('change')会变成 onChange,这是 Vue 事件绑定的内部规则
props.onChange从组件的 vnode.props 上查找对应的事件处理函数
callWithAsyncErrorHandling调用函数时,带有错误处理机制(防止 UI 崩溃)

🧠 总结流程图(简化)

emit('change', value)↓
组件内部的 emit 实例函数↓
调用 @vue/runtime-core 的 emit(instance, 'change', value)↓
查找 props 中的 onChange↓
找到后执行 onChange(value)

🔍 结合运行时举个实际例子

const emit = defineEmits(['submit'])function onClick() {emit('submit', { name: 'Vue' })
}

编译后模板中,父组件绑定的是 onSubmit

<Child @submit="handleSubmit" />

Vue 会在创建 VNode 时把 @submit="handleSubmit" 转成:

props: {onSubmit: handleSubmit
}

然后通过上面提到的 emit 源码逻辑找到 onSubmit 并执行。


📌 总结

  • Vue 3 中的 emit 是通过组件实例绑定的 emit 函数实现的;
  • 实际调用的是 runtime-core 中的 emit(instance, eventName, ...args)
  • emit 会根据事件名(如 change)生成 onChange 并在 props 中查找是否有对应函数;
  • callWithAsyncErrorHandling 确保事件处理函数执行时出错不会影响整个应用。

相关文章:

  • CUDA编程——性能优化基本技巧
  • 海盗王64位服务端+32位客户端3.0版本
  • 前端性能优化全攻略:从基础体验到首屏加载的深度实践
  • pytest自动化测试执行环境切换的两种解决方案
  • 批量修改json文件中的标签
  • 【Linux基础】网络相关命令
  • 202536 | KafKa生产者分区写入策略+消费者分区分配策略
  • 深入解析进程地址空间:从虚拟到物理的奇妙之旅
  • 通过推测搜索加速大型语言模型推理 (SpecSearch) 论文总结
  • PySide6 GUI 学习笔记——常用类及控件使用方法(常用类字体QFont)
  • 【图书管理系统】深度讲解:图书列表展示的后端实现、高内聚低耦合的应用、前端代码讲解
  • 神经网络极简入门技术分享
  • 【入门】数字走向I
  • 数字信号处理|| 离散系统的冲激响应和阶跃响应
  • Web3 学习全流程攻略
  • CAD属性图框值与Excel联动(CAD块属性导出Excel、excel更新CAD块属性)——CAD c#二次开发
  • 【AI大模型学习路线】第一阶段之大模型开发基础——第五章(提示工程技术-2)Active-prompt。
  • JavaScript 数组去重:11 种方法对比与实战指南
  • 每天五分钟机器学习:KTT条件
  • QMK自定义4*4键盘固件创建教程:最新架构详解
  • 云南多地突查公职人员违规饮酒:公安局门口开展酒精吹气测试
  • 重庆大学通报本科生发14篇SCI论文:涉事学生及其父亲被处理
  • 网络主播直播泄机密,别让这些“小事”成威胁国家安全的“突破口”
  • 中俄弘扬正确二战史观:缅怀历史,重拾初心,阻止悲剧重演
  • 海南省三亚市委原常委、秘书长黄兴武被“双开”
  • 河南省平顶山市副市长许红兵主动投案,接受审查调查