Vue 3 怎么在 `` 中使用 defineEmits 声明向外抛出的事件类型

秋伟大大_5120

秋伟大大_5120

2026-09-10

333人浏览

原创

defineemits需在顶层调用,支持数组写法(如['submit', 'cancel'])和ts泛型对象写法(如{ 'submit': (data: { id: number; name: string }) => void }),后者更推荐以保障类型安全与ide提示。

vue 3 怎么在 `<script setup>` 中使用 defineemits 声明向外抛出的事件类型">` 中使用 defineemits 声明向外抛出的事件类型"></p>
<p>在 `<script setup>` 中使用 `defineEmits` 声明向外抛出的事件,核心是**显式定义事件名和参数类型**,既保障类型安全,又让 IDE 能自动提示、编译期捕获错误。</script></p>

<h3>怎么写 defineEmits 声明</h3>
<p>必须在 `<script setup>` 的顶层调用,不能放在函数或条件块里。支持两种主流写法:</script></p>
<ul>
<li>
<strong>数组写法(适合简单场景)</strong>:只声明事件名,不校验参数<br><code>const emit = defineEmits(['submit', 'cancel', 'update:modelValue'])</code>
</li>
  <li>
<strong>TS 泛型对象写法(推荐,尤其搭配 TypeScript)</strong>:精确约束每个事件的参数个数、类型和顺序<br><pre class=const emit = defineEmits  'submit': (data: { id: number; name: string }) => void;<br>  'cancel': () => void;<br>  'update:modelValue': (val: string) => void;<br>()

命名要注意 update:xxx 格式

如果子组件接收了某个 prop(比如 modelValue 或 title),想通知父组件更新它,事件名应统一用 update:xxx 形式:

vue-component-analyzer
vue-component-analyzer

递归分析 Vue 项目组件依赖,从入口文件生成组件层级图,支持 Vue 2/3,输出组件名、文件路径和属性。适用于分析组件结构、排查依赖或了解项目架构。

下载
  • 接收 modelValue → 声明 'update:modelValue' → 父组件可直接用 v-model
  • 接收 title → 声明 'update:title' → 父组件可用 v-model:title
  • 避免写成 onUpdateTitle 或 changeTitle,否则无法对接 v-model 机制

怎么触发事件才合法

声明后拿到的 emit 是一个函数,调用时必须严格匹配声明的内容:

  • 事件名大小写、连字符、冒号都要完全一致(比如 update:modelValue 不能写成 updateModelValue)
  • 参数数量和类型必须吻合泛型声明(TS 下传错会立刻报错,如把字符串传给期望 number 的 update:count)
  • 常见调用示例:
    emit('cancel')(无参)
    emit('submit', { id: 1, name: 'Vue' })(对象参数)
    emit('update:modelValue', 'new text')(v-model 场景)

别踩这些坑

几个高频错误要避开:

  • 在模板里写 @click="$emit('xxx')" —— `

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Vue 教程
Vue 教程

共42课时 | 17万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.4万人学习

Vue.js 微实战--十天技能课堂
Vue.js 微实战--十天技能课堂

共18课时 | 1.7万人学习