1、简介
- Vue 3中的
emits
方法主要用于在子组件中声明它可以触发的事件,这些事件可以被父组件监听和处理。 -
emits
方法不仅提供了一种组件间通信的方式,还允许开发者在子组件中定义事件的验证规则,确保事件传递的数据符合预期。
2、基本用法
- 在Vue 3中,
emits
可以通过两种方式使用:在<script>
标签的export default
对象中直接使用,或者在<script setup>
标签中使用defineEmits
编译器宏。
2.1 在<script>
标签中使用
在<script>
标签中,emits
可以是一个数组或对象。数组形式简单列出子组件可能触发的所有事件名;对象形式则允许为每个事件指定验证函数。
-
数组形式:
export default {
emits: ['update', 'delete'],
// ... 其他选项
}
- 对象形式:
export default {
emits: {
// 无验证函数
update: null,
// 有验证函数
delete: (payload) => {
if (typeof payload === 'number') {
return true;
} else {
('Invalid delete event payload');
return false;
}
}
},
// ... 其他选项
}
2.2 在<script setup>
标签中使用defineEmits
- 在
<script setup>
中,defineEmits
用于声明组件的emits
。与在<script>
标签中直接声明不同,defineEmits
是一个编译器宏,只能在<script setup>
中使用。
<script setup>
import { defineEmits } from 'vue';
const emit = defineEmits(['update', 'delete']);
function handleClick() {
emit('update', { id: 1, name: 'New Name' });
// 或者
emit('delete', 123);
}
</script>
3. 事件触发
- 无论使用哪种方式声明
emits
,触发事件的方式都是通过组件实例的$emit
方法。在Vue 3中,这通常是在组件的方法中完成的。
export default {
methods: {
someMethod() {
this.$emit('some-event', { /* 数据 */ });
}
}
}
// 或者在 <script setup> 中
<script setup>
import { defineEmits } from 'vue';
const emit = defineEmits(['some-event']);
function someMethod() {
emit('some-event', { /* 数据 */ });
}
</script>
4. 父组件监听
- 在父组件中,可以通过
v-on
指令(或其简写形式@
)来监听子组件触发的事件。
<template>
<ChildComponent @update="handleUpdate" @delete="handleDelete" />
</template>
<script>
import ChildComponent from './';
export default {
components: {
ChildComponent
},
methods: {
handleUpdate(payload) {
// 处理更新事件
},
handleDelete(id) {
// 处理删除事件
}
}
}
</script>