vue3 组合式API defineEmits() 与 emits 组件选项详解

 更新时间:2024年09月29日 10:31:13   作者:fishmemory7sec  
在Vue中,defineEmits()是Vue3组合式API中用于声明自定义事件的,而emits选项则用于Vue2和Vue3的选项式API中,defineEmits()允许使用字符串数组或对象形式声明事件,emits选项也支持这两种形式,且验证函数可以验证事件参数,这两种方法都是为了更规范地在组件间通信

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')来触发incrementdecrement这两个事件。

对象语法:

<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函数的返回值是一个函数,通常命名为emitemit可以在子组件中触发自定义事件。当子组件需要向父组件传递数据或通知父组件发生了某些事情时,可以使用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是一个组件选项,它是一个字符串数组,其中customEvent1customEvent2是这个组件可以触发的两个自定义事件。在组件的方法中,可以通过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 组件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue过渡和animate.css结合使用详解

    vue过渡和animate.css结合使用详解

    本篇文章主要介绍了vue过渡和animate.css结合使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • element ui富文本编辑器的使用效果与步骤(quill-editor)

    element ui富文本编辑器的使用效果与步骤(quill-editor)

    富文本编辑器在任何项目中都会用到,在Element中我们推荐vue-quill-editor组件,下面这篇文章主要给大家介绍了关于element ui富文本编辑器的使用效果与步骤(quill-editor)的相关资料,需要的朋友可以参考下
    2022-10-10
  • Vue实现简单的发表评论功能

    Vue实现简单的发表评论功能

    这篇文章主要为大家详细介绍了Vue实现简单的发表评论功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • vue实现pdf文件发送到邮箱功能的示例代码

    vue实现pdf文件发送到邮箱功能的示例代码

    这篇文章主要介绍了vue实现pdf文件发送到邮箱功能,实现代码包括对邮箱格式内容是否为空的验证方法,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • go-gin-vue3-elementPlus带参手动上传文件的案例代码

    go-gin-vue3-elementPlus带参手动上传文件的案例代码

    这篇文章主要介绍了go-gin-vue3-elementPlus带参手动上传文件的案例代码,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-11-11
  • vue+uniapp实现生成二维码

    vue+uniapp实现生成二维码

    这篇文章主要为大家详细介绍了vue结合uniapp实现生成二维码的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以学习一下
    2023-12-12
  • Electron+Vue3+Vite搭建桌面应用的示例代码

    Electron+Vue3+Vite搭建桌面应用的示例代码

    本文主要介绍了Electron+Vue3+Vite搭建桌面应用的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • vue中插件和组件的区别点及用法总结

    vue中插件和组件的区别点及用法总结

    在本篇文章里小编给大家分享的是一篇关于vue中插件和组件的区别点及用法总结内容,有兴趣的的朋友们可以学习下。
    2021-12-12
  • Vue之常用的内置指令详解

    Vue之常用的内置指令详解

    这篇文章主要为大家介绍了Vue之常用的内置指令,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11
  • 在Vue中实现对文件的压缩和解压缩功能

    在Vue中实现对文件的压缩和解压缩功能

    在前端开发中,文件的压缩和解压缩是经常需要用到的功能,尤其是在需要上传和下载文件的场景下,文件压缩可以减小文件大小,加快文件传输速度,提高用户体验,本文将介绍在Vue项目中如何进行文件的压缩和解压缩,需要的朋友可以参考下
    2023-11-11

最新评论