当前位置: 首页 > news >正文

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><ChildComponentclass="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 会在开发环境下发出警告。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • STM32 单片机最小系统全解析
  • Linux自主学习篇
  • Qt Creator项目模板介绍
  • 视频相关处理
  • MQ入门(4)
  • 【Python】Maya:为人类打造的 Python 日期时间库
  • 抓机遇,促发展——2025第十二届广州国际汽车零部件加工技术及汽车模具展览会
  • Java内存泄漏排查
  • Ansible部署与应用基础
  • Git清除某文件所有历史提交记录
  • 【Redis】之Geo
  • 【机器学习】——线性回归(自我监督学习)
  • 秒变 Vim 高手:必学的编辑技巧与隐藏功能大揭秘
  • 【设计模式】UML类图
  • Streamlit:使用 Python 快速开发 Web 应用
  • [Vue CLI 3] 配置解析之 css.extract
  • Fabric架构演变之路
  • isset在php5.6-和php7.0+的一些差异
  • nfs客户端进程变D,延伸linux的lock
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • Spring Cloud Feign的两种使用姿势
  • Sublime text 3 3103 注册码
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • Vue学习第二天
  • 聊聊flink的BlobWriter
  • 前端js -- this指向总结。
  • 如何胜任知名企业的商业数据分析师?
  • 如何用vue打造一个移动端音乐播放器
  • 优化 Vue 项目编译文件大小
  • ​【经验分享】微机原理、指令判断、判断指令是否正确判断指令是否正确​
  • ​香农与信息论三大定律
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #pragma once与条件编译
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • (14)Hive调优——合并小文件
  • (Java入门)抽象类,接口,内部类
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (不用互三)AI绘画工具应该如何选择
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转)Oracle 9i 数据库设计指引全集(1)
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET Framework 4.6.2改进了WPF和安全性
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .Net的C#语言取月份数值对应的MonthName值
  • .NET开源项目介绍及资源推荐:数据持久层
  • .net快速开发框架源码分享