Vue 3 自定义事件传参靠子组件 emit 带值 + 父组件 @ 绑定回调接收,需先在子组件用 defineEmits 声明事件,再调用 emit('event', ...args);父组件通过 @event="handler" 接收,handler 形参与 emit 实参一一对应。

Vue 3 中绑定自定义事件并传递参数,核心是靠 子组件触发 emit + 父组件监听并接收参数,不是靠事件绑定语法本身“传参”,而是通过 emit 调用时带值实现的。
父组件:用 @ 绑定事件,回调函数自动接收参数
在父组件模板中,用 @事件名 绑定子组件发出的事件,等号右边写一个函数(或内联表达式),该函数的第一个参数就是子组件调用 emit 时传入的值:
<Child @send-toy="getToy" />- 对应方法:
function getToy(value) { console.log('收到玩具:', value) } - 如果传多个参数,比如
emit('send-toy', name, id, type),那getToy函数形参也写三个:getToy(name, id, type)
子组件:先声明再 emit,参数写在 emit 调用里
子组件必须显式声明它要触发哪些自定义事件,然后才能用 emit 发送:
- 声明:
const emit = defineEmits(['send-toy', 'update-user']) - 触发(带参):
emit('send-toy', '遥控车')或emit('update-user', { id: 1, name: '小明' }) - 可以在任意逻辑中触发——按钮点击、异步请求完成、生命周期钩子等,不局限于模板事件
常见写法对比:避免直接在模板里写内联函数传参
❌ 不推荐这样写(语义不清、难以复用、破坏响应式追踪):<button @click="$emit('send-toy', toy)">送出</button>
✅ 推荐封装成方法再调用:<button @click="sendToy">送出</button>const sendToy = () => emit('send-toy', toy)
这样更清晰,便于加日志、校验、或后续扩展逻辑。
立即学习“前端免费学习笔记(深入)”;
进阶:类型安全(TS 场景下建议)
使用泛型声明 emit 类型,让 IDE 和编译器能校验参数个数和类型:
const emit = defineEmits<{ (e: 'send-toy', name: string): void; (e: 'update-user', user: User): void }>()- 如果传错类型(比如把 number 当 string 传),TypeScript 会立刻报错


















