defineemits用于声明组件自定义事件,需明确事件名及参数类型:数组写法列事件名,对象写法配ts接口确保类型安全;触发时须严格匹配声明的名称与参数;避免与原生事件同名。

直接用 defineEmits 声明事件,核心就两点:明确写清要发哪些事件、按约定方式触发。它不是可有可无的装饰,而是 Vue3 类型安全和运行时行为的基石。
基础声明:数组写法最常用
在 <script setup></script> 中,传入一个字符串数组,列出所有子组件会主动触发的自定义事件名:
const emit = defineEmits(['submit', 'cancel', 'update:modelValue'])- 父组件就能放心绑定
@submit、@cancel,IDE 和 TypeScript 也能自动提示补全 - 注意:数组里只写事件名,不带
@,也不写参数
类型安全声明:TS 推荐用对象写法
用泛型接口描述每个事件的签名,让参数类型、是否可选一目了然:
const emit = defineEmits()- 调用
emit('submit', { name: 'Alice' })时,如果传错类型或漏参数,TS 编译期就会报错 - 特别适合表单提交、API 响应等关键路径,避免运行时“undefined is not a function”类错误
触发事件:必须用声明过的名称,参数严格对齐
声明只是第一步,触发时必须完全匹配声明的事件名和参数结构:
- ✅ 正确:
emit('submit', payload)或emit('error', '网络异常', 503) - ❌ 错误:
emit('Submit')(大小写敏感)、emit('submint')(拼写错误)、emit('submit')(少传 payload) - 如果用了 TS 接口声明,编辑器会实时标红不合规的调用,这是最实用的开发保障
避坑重点:别和原生事件同名
声明 ['click'] 会让父组件的 @click 绑定失效,变成监听自定义 click 而非 DOM 点击:
- ❌ 避免:
defineEmits(['click', 'input']) - ✅ 推荐:
defineEmits(['clicked', 'inputChanged'])或保留原生,另起名字如onConfirm - 若真需透传原生点击,用
v-bind="$attrs"或显式解构const { onClick, ...rest } = $attrs,再手动绑定到内部元素
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










