vue中子组件向父组件传值的核心是$emit触发自定义事件,父组件用@监听并响应;事件名推荐短横线格式,需严格匹配大小写,setup中须用defineemits声明。

Vue 中子组件向父组件传值,核心就是 $emit 配合 v-on(或 @)监听。这不是“黑魔法”,而是 Vue 响应式通信的约定机制——子组件主动触发事件,父组件决定如何响应。
自定义事件怎么写:命名与触发
子组件内部调用 this.$emit('事件名', 参数1, 参数2...) 即可抛出事件。事件名推荐用短横线格式(如 update-user),避免驼峰(updateUser)在 HTML 模板中失效(因为标签属性不区分大小写)。
常见写法示例:
-
this.$emit('input', newValue)—— 模拟原生input行为,配合v-model -
this.$emit('submit-form', formData)—— 提交表单时把数据传给父组件 -
this.$emit('close-dialog')—— 不带参数的纯通知型事件
父组件怎么接收:监听与响应
父组件在使用子组件标签时,用 @事件名="处理函数" 或 v-on:事件名="处理函数" 监听。处理函数可以是方法名、内联语句,也可以是箭头函数(注意 this 指向)。
递归分析 Vue 项目组件依赖,从入口文件生成组件层级图,支持 Vue 2/3,输出组件名、文件路径和属性。适用于分析组件结构、排查依赖或了解项目架构。
例如:
-
<user-input></user-input>→ 调用methods中的handleSave方法 -
<modal false></modal>→ 直接更新状态 -
<counter> count += val"></counter>→ 内联逻辑(适合简单操作)
结合 v-model 的简写原理
v-model 在组件上本质是语法糖:v-model="value" 等价于 :value="value" @input="value = $event"。所以子组件只要 $emit('input', newValue),父组件就能自动同步。
Vue 3 中支持自定义 v-model 修饰符和多个绑定(如 v-model:title),对应需 defineModel 或 modelValue + update:modelValue 事件,但底层仍是 $emit 驱动。
注意事项与避坑点
容易忽略但影响调试的细节:
- 事件名拼错或大小写不一致 → 父组件监听不到(控制台无报错,静默失败)
- 子组件未在生命周期合适时机 emit(比如异步请求还没返回就 emit)→ 传的是初始值或 undefined
- 父组件监听函数没定义或拼错 → 控制台报
TypeError: _vm.xxx is not a function - 在 setup() 中使用
emit需通过defineEmits声明,否则 TypeScript 报错或 IDE 无提示
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!









