# Добавлена опция emits
новое
# Обзор
Vue 3 теперь предоставляет опцию emits
, похожую на существующую опцию props
. Её можно использовать для объявления событий, которые могут быть сгенерированы компонентом для своих родителей.
# Поведение в 2.x
Во Vue 2 можно объявлять входные параметры, которые компонент получает, но нет возможности объявить какие события он может генерировать:
<template>
<div>
<p>{{ text }}</p>
<button @click="$emit('accepted')">OK</button>
</div>
</template>
<script>
export default {
props: ['text']
}
</script>
2
3
4
5
6
7
8
9
10
11
12
# Поведение в 3.x
Аналогично входным параметрам, теперь можно определить события которые генерирует компонент с помощью опции emits
:
<template>
<div>
<p>{{ text }}</p>
<button @click="$emit('accepted')">OK</button>
</div>
</template>
<script>
export default {
props: ['text'],
emits: ['accepted']
}
</script>
2
3
4
5
6
7
8
9
10
11
12
13
Опция также принимает объект, что позволяет указать валидаторы для аргументов, которые передаются вместе с генерируемым событием, аналогично валидации при объявлении props
.
Для получения дополнительной информации, ознакомьтесь с документацией API для этой возможности.
# Стратегия миграции
Настоятельно рекомендуется документировать все события, которые может генерировать компонент с помощью emits
.
Это особенно важно из-за удаления модификатора .native
. Теперь любой слушатель события, не указанный в emits
, будет добавлен в свойство $attrs
компонента, что по умолчанию станет привязывать его к корневому узлу компонента.
# Пример
Для компонентов, которые переопределяют нативные события для своих родителей, это приведёт к генерации двух событий:
<template>
<button @click="$emit('click', $event)">OK</button>
</template>
<script>
export default {
emits: [] // без объявленного события
}
</script>
2
3
4
5
6
7
8
9
Когда родитель прослушивает событие click
на компоненте:
<my-button @click="handleClick"></my-button>
обработчик события будет вызван дважды:
- Один раз от
$emit()
. - Один раз от нативного обработчика события, привязанного к корневому элементу.
Здесь есть два варианта:
- Корректно объявить событие
click
. Это полезно, если действительно добавите некоторую логику в обработчик события в<my-button>
. - Удалить повторную генерацию события, так как родитель может легко отслеживать нативные события, без добавления
.native
. Подходит в тех случаях, когда действительно генерируете заново событие в любом случае.