defineemits() 和 emits组件选项在功能上都是用于声明组件可以向外触发的事件。它们的核心目的都是让组件明确地告知外界它能够发出哪些自定义事件,以此来规范组件间的通信。
defineemits()在 vue 3 的组合式 api 中使用。emits组件选项 在vue 2 及 vue 3 的选项式 api 中使用。
defineemits()
defineemits()用于声明由组件触发的自定义事件。
可以以两种形式声明触发的事件:
- 使用字符串数组的简易形式。
- 使用对象的完整形式。该对象的每个属性键是事件的名称,值是
null或一个验证函数。- 验证函数应返回布尔值,以表明事件参数是否通过了验证。
字符串数组语法:
<script setup> const emit = defineemits(['increment', 'decrement']); </script>
defineemits接收一个字符串数组['increment', 'decrement'],这意味着在该组件内部可以通过emit('increment')和emit('decrement')来触发increment和decrement这两个事件。
对象语法:
<script setup>
const emit = defineemits({
updatecount: (newcount) => {
return typeof newcount === 'number';
}
});
</script>defineemits接收一个对象,对象的键updatecount是事件名称,值是一个验证函数(newcount) => { return typeof newcount === 'number'; }。当在组件内部调用emit('updatecount', value)时,这个验证函数会检查传递的value是否为数字类型,如果不是,vue 会在开发环境下给出警告。
defineemits函数的返回值是一个函数,通常命名为emit。emit可以在子组件中触发自定义事件。当子组件需要向父组件传递数据或通知父组件发生了某些事情时,可以使用emit函数触发相应的自定义事件。
示例
子组件childcomponent.vue:
<!-- childcomponent.vue -->
<template>
<h2>childcomponent的标题</h2>
<div>childcomponent的内容</div>
<div>count: {{ count }}</div>
<div>在childcomponent中展示customvalue的值:{{ attrs.customvalue }}</div>
<button @click="changecount">修改count 并 赋值给 父组件的 customvalue</button>
</template>
<script setup lang="ts">
import { ref, useattrs } from 'vue';
let attrs = useattrs();
let count = ref(1);
const emit = defineemits({
updatecustomvalue: count => {
return typeof count.value == 'number';
}
});
const changecount = () => {
count.value++
emit('updatecustomvalue', count.value);
};
</script>在父组件中使用childcomponent.vue:
<template>
<div class="home-wrap">
<h1>父组件</h1>
<childcomponent
class="child-div"
:customvalue="customvalue"
@updatecustomvalue="updatecustomvalue"
/>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import childcomponent from './childcomponent.vue';
const customvalue = ref(10);
const updatecustomvalue = ($event: number) => {
console.log($event);
customvalue.value = $event;
};
</script>如果将子组件的count 属性声明为字符串count = ref('hello world'),点击按钮,调用emit('updatecustomvalue', count.value);,字符串hello world 会被赋值给 customvalue。
浏览器控制台报错:
invalid event arguments: event validation failed for event “updatecustomvalue”.
无效的事件参数:事件"updatecustomvalue"验证失败。
emits组件选项
emits用于声明由组件触发的自定义事件。
可以以两种形式声明触发的事件:
- 使用字符串数组的简易形式。
- 使用对象的完整形式。该对象的每个属性键是事件的名称,值是
null或一个验证函数。- 验证函数会接收到传递给组件的
$emit调用的额外参数。例如,如果this.$emit('foo', 1)被调用,foo相应的验证函数将接受参数1。 - 验证函数应返回布尔值,以表明事件参数是否通过了验证。
- 验证函数会接收到传递给组件的
字符串数组语法:
export default {
emits: ['customevent1', 'customevent2']
};emits是一个组件选项,它是一个字符串数组,其中customevent1和customevent2是这个组件可以触发的两个自定义事件。在组件的方法中,可以通过this.$emit('customevent1', data)来触发customevent1事件,并传递相关数据data。
对象语法:
export default {
emits: {
customevent: (payload) => {
// 验证逻辑,例如检查 payload 的类型或值
return payload > 0;
}
}
};emits是一个对象,customevent是事件名称,其对应的值是一个验证函数。当在组件内部通过this.$emit('customevent', value)触发事件时,这个验证函数会检查传递的value是否符合条件(这里是value > 0)。如果不符合,vue 会在开发环境下发出警告。
到此这篇关于vue3 组合式api defineemits() 与 emits 组件选项的文章就介绍到这了,更多相关vue3 api defineemits() 与 emits 组件内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论