跳至内容

emits 选项

概述

Vue 3 现在提供了一个 emits 选项,类似于现有的 props 选项。此选项可用于定义组件可以向其父级发出的事件。

2.x 行为

在 Vue 2 中,您可以定义组件接收的 props,但不能声明它可以发出的事件

vue
<template>
  <div>
    <p>{{ text }}</p>
    <button v-on:click="$emit('accepted')">OK</button>
  </div>
</template>
<script>
  export default {
    props: ['text']
  }
</script>

3.x 行为

与 props 类似,组件发出的事件现在可以使用 emits 选项定义

vue
<template>
  <div>
    <p>{{ text }}</p>
    <button v-on:click="$emit('accepted')">OK</button>
  </div>
</template>
<script>
  export default {
    props: ['text'],
    emits: ['accepted']
  }
</script>

该选项还接受一个对象,允许开发人员为与已发出事件一起传递的参数定义验证器,类似于 props 定义中的验证器。

有关此内容的更多信息,请阅读 此功能的 API 文档

迁移策略

强烈建议您使用 emits 记录每个组件发出的所有事件。

这尤其重要,因为 移除了 .native 修饰符。现在,对未用 emits 声明的事件的任何监听器都将包含在组件的 $attrs 中,默认情况下将绑定到组件的根节点。

示例

对于重新向其父级发出本机事件的组件,这现在会导致触发两个事件

vue
<template>
  <button v-on:click="$emit('click', $event)">OK</button>
</template>
<script>
export default {
  emits: [] // without declared event
}
</script>

当父级监听组件上的 click 事件时

html
<my-button v-on:click="handleClick"></my-button>

它现在将被触发 两次

  • 一次来自 $emit()
  • 一次来自应用于根元素的本机事件监听器。

这里您有两个选择

  1. 正确声明 click 事件。如果您确实在 <my-button> 中为该事件处理程序添加了一些逻辑,这将很有用。
  2. 删除事件的重新发出,因为父级现在可以轻松地监听本机事件,而无需添加 .native。当您实际上只是重新发出事件时,这很适合。

另请参阅