【超细节】Vue3组件事件怎么声明,defineEmits与emit

目录

前言

一、基本语法

1. 子组件触发

2. 父组件监听

二、 事件参数

1. 传值

2. 接收值

三、 事件校验

四、注意事项


前言

组件事件是 Vue 组件之间进行通信的一种方式。它允许一个组件触发一个自定义事件,并且其他组件可以监听并响应这个事件。

一、基本语法

1. 子组件触发

子组件触发自定义的事件有两种方式。

  • 模板表达式中

在组件的模板表达式中,可以直接使用 $emit 方法触发自定义事件,例如:

<!-- SonCom -->
<button @click="$emit('someEvent')">click me</button>
  • <script setup> 里

显式地通过 defineEmits() 宏来声明它要触发的事件。注意,defineEmits只等在<script setup> 的顶级作用域下使用,不能在别的函数里。

科普一下:在计算机编程中,宏(Macro)通常是一种预处理指令或代码片段,用于在编译过程之前进行文本替换和代码生成。宏可以帮助简化代码编写、提高代码的复用性和可维护性。

然后使用defineEmits() 返回的跟模板里面的 $emit 相同作用的函数来触发。

<script setup>
// 声明
const emit = defineEmits(['touchFather', 'submitFather'])// 触发
function buttonClick() {emit('touchFather')
}
</script>
  • 非 <script setup> 里

事件需要通过 emits 选项来定义,emit 函数也被暴露在 setup() 的上下文对象上。

export default {emits: ['inFocus', 'submit'],setup(props, ctx) {ctx.emit('submit')}
}

2. 父组件监听

和Vue2一样,父组件可以通过 v-on (缩写为 @) 来监听事件:

<SonCom @some-event="callback" />

ps:事件名可以用驼峰形式,但是在模板中是推荐使用kebab-case 形式来编写。

二、 事件参数

如果我们需要再触发事件的时候给父组件传特定的值,就可以提供给 $emit 额外的参数。

1. 传值

  • 模板里传值
<button @click="$emit('chooseA', 1)">chooseA
</button>
  • script里传值
<script setup>
// 声明
const emit = defineEmits(['touchFather', 'submitFather'])// 触发并传值
function buttonClick() {emit('touchFather', num)
}
</script>

所有传入 $emit() 或 emit() 的额外参数都会传过去,传参不限制个数。

2. 接收值

  • 模板里接收值
<SonCom @touch-father="(num) => count = num" />
  • 方法里接收值
<SonCom @touch-father="handleNum" /><script>function handleNum(num) {count.value += num}
</script>

三、 事件校验

事件也可以像Props一样来进行校验。只需要将上面的数组换成对象。对象里事件被赋值为一个函数。接受的参数就是抛出事件时传入 emit 的内容,返回一个布尔值来表明事件是否合法。

<script setup>
const emit = defineEmits({// 没有校验touchFather: null,// 校验 submitFather 事件submitFather: ({ email, password }) => {if (email && password) {return true} else {console.warn('Invalid submit event payload!')return false}}
})function submitForm(email, password) {emit('submitFather', { email, password })
}
</script>

示例:

子组件:校验并且传参不符合校验规则

<template><div><button @click="submitForm">子传父</button></div>
</template><script setup>const obj = {email: '',password: ''}const emit = defineEmits({// 没有校验touchFather: null,// 校验 submitFather 事件submitFather: ({ email, password }) => {if (email && password) {return true}console.log('传参无效!')return false}})function submitForm() {emit('submitFather', obj)}
</script>

父组件:

<template><div><ChildComponent @submit-father="handle" /></div>
</template><script setup>import ChildComponent from './ChildComponent.vue'function handle({ email, password }) {console.log('父组件——', email, password)}
</script>

运行结果:

传参失败,并且Vue报错。

如果给obj值通过校验:

<template><div><button @click="submitForm">子传父</button></div>
</template><script setup>const obj = {email: 123,password: 123}const emit = defineEmits({// 没有校验touchFather: null,// 校验 submitFather 事件submitFather: ({ email, password }) => {if (email && password) {return true}console.log('传参无效!')return false}})function submitForm() {emit('submitFather', obj)}
</script>

结果:

四、注意事项

1. 组件触发的事件没有冒泡机制

2. 如果一个原生事件的名字 (例如 click) 被定义在 emits 选项中,则监听器只会监听组件触发的 click 事件而不会再响应原生的 click 事件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/25557.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

electron+vue+ts窗口间通信

文章目录 一. 目的二.逻辑分析三. 代码示例 "types/node": "^20.3.1","vitejs/plugin-vue": "^4.1.0","vueuse/electron": "^10.2.1","electron": "^25.2.0","electron-packager":…

docker部署jenkins且jenkins中使用docker去部署项目

docker部署jenkins且jenkins中使用docker去部署项目 1、确定版本 2.346.1是最后一个支持jdk8的 2、编写docker-compose.yml并执行 在这个目录中新增data文件夹&#xff0c;注意data是用来跟docker中的文件进行映射的 docker-compose.yml version: "3.1" service…

设置鼠标右键打开方式,添加IDEA的打开方式

已下载IDEA&#xff0c;但是右键打开之前保存的项目文件&#xff0c;无法显示以IDEA方式打开。 二、解决步骤 1. 打开注册表 winR键输入regedit 2、查找路径为计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shell &#xff08;我找了半天没看到Classes,建议直接粘…

Mysql底层重点

索引分类&#xff1a; 按物理存储分类&#xff1a;聚簇索引&#xff08;主键索引&#xff09;、二级索引&#xff08;辅助索引&#xff09; 按字段特性分类&#xff1a;主键索引&#xff0c;普通索引&#xff0c;唯一索引&#xff0c;前缀索引 按字段个数分类&#xff1a;单…

java.io.File类的使用

文章目录 概述构造器常用方法1、获取文件和目录基本信息2、列出目录的下一级3.File类的重命名功能4、判断功能的方法5、创建、删除功能 练习 概述 File类及本章下的各种流&#xff0c;都定义在java.io包下。一个File对象代表硬盘或网络中可能存在的一个文件或者文件目录&#…

day38 滑动窗口

1. 滑动窗口 应用场景&#xff1a; 满足xxx条件&#xff08;计算结果、出现次数、同时包含&#xff09; 关键词&#xff1a;最长最短子串无重复等等 1&#xff09;最长 左右指针在起始点&#xff0c;R 向右依次滑动循环&#xff1b; 如果&#xff1a; 窗内元素满足条件&#x…

C#设计模式之---简单工厂模式

简单工厂模式(Simple Factory Pattern) 简单工厂模式定义一个类来负责创建其他类的实例&#xff0c;被创建的实例通常都具有共同的父类。因为在简单工厂模式中用于创建实例的方法是静态&#xff08;static&#xff09;方法&#xff0c;又叫做静态工厂方法&#xff08;Static F…

【Groups】50 Matplotlib Visualizations, Python实现,源码可复现

详情请参考博客: Top 50 matplotlib Visualizations 因编译更新问题&#xff0c;本文将稍作更改&#xff0c;以便能够顺利运行。 1 Dendrogram 树状图根据给定的距离度量将相似的点组合在一起&#xff0c;并根据点的相似性将它们组织成树状的链接。 新建文件Dendrogram.py: …

PHP Smarty有哪些常用的标签和函数?

首先&#xff0c;让我们先了解一下Smarty。 Smarty是一个开源的PHP模板引擎&#xff0c;它能够帮助你把逻辑代码和显示代码分离&#xff0c;让你的网站代码更加整洁&#xff0c;易于维护。Smarty让你可以使用一些简单的标签和函数&#xff0c;而不需要在HTML中混合PHP代码。这…

session-cookies 三个缓存 localStorage、sessionStorage、Cookies。

session-cookies session-cookies is localStorage、sessionStorage、Cookies。session-cookies This plugin is used to summarize the browser’s three caches localStorage, sessionStorage, Cookies.The plugin is designed to be quick and easy to use. Below is a sum…

鸿鹄工程项目管理系统em Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统 em

​ Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目…

计算机网络-性能指标

计算机网络-性能指标 文章目录 计算机网络-性能指标简介速率比特速率 带宽吞吐量时延时延计算 时延带宽积往返时间网络利用率丢包率总结 简介 性能指标可以从不同的方面来度量计算机网络的性能 常用的计算机网络的性能指标有以下8个 速率带宽吞吐量时延时延带宽积往返时间利…

C++ 学习系列 1 -- 左值、右值与万能引用

1. 何为左值&#xff1f;何为右值&#xff1f; 简单的说&#xff0c;左值可以放在等号的左边&#xff0c;右值可以放在等号的右边。 左值可以取地址&#xff0c;右值不能取地址。 1.1 左值举例&#xff1a; 变量、函数或数据成员返回左值引用的表达式 如 x、x 1、cout <…

ARCGIS地理配准出现的问题

第一种。已有省级行政区矢量数据&#xff0c;在网上随便找一个相同省级行政区图片&#xff0c;利用地理配准工具给图片添加坐标信息。 依次添加省级行政区选择矢量数据、浙江省图片。 此时&#xff0c;图层默认的坐标系与第一个加载进来的省级行政区选择矢量数据的坐标系一致…

springboot和Django哪一个做web服务器框架更好

目录 一、两者特点 二、各自优势 一、两者特点 编程语言&#xff1a; Spring Boot&#xff1a;使用 Java 编程语言。Django&#xff1a;使用 Python 编程语言。 生态系统和社区支持&#xff1a; Spring Boot&#xff1a;具有庞大的 Java 生态系统和强大的社区支持。适用于大型…

Python(三)

诚信像一面镜子&#xff0c;一旦打破&#xff0c;你的人格就会出现裂痕。 存在短路的情景 谢谢观看 Python(三)

如何用flex实现网页布局?

使用CSS的Flexbox&#xff08;简称Flex&#xff09;布局可以方便地实现网页布局。Flexbox是一种弹性布局模型&#xff0c;通过简单的属性设置&#xff0c;可以灵活地控制子元素在容器内的排列方式和对齐方式。以下是使用Flexbox实现网页布局的基本步骤&#xff1a; 1、创建HTM…

一百四十三、Linux——Linux的CentOS 7系统语言由中文改成英文

一、目的 之前安装CentOS 7系统的时候把语言设置成中文&#xff0c;结果Linux文件夹命名出现中文乱码的问题&#xff0c;于是决定把Linux系统语言由中文改成英文 二、实施步骤 &#xff08;一&#xff09;到etc目录下&#xff0c;找到配置文件locale.conf # cd /etc/ # ls…

【webpack】一些零碎的知识点记录:eslint配置、source-map配置、devServer配置

文章目录 前言eslint安装配置设置规则 devtool设置js.map文件使用模式解释文件说明建议方案 devServer安装配置 前言 有些知识点不知道咋归类&#xff0c;就先暂时放在同一个文章里了。这里只记录配置方式&#xff0c;配置的东西是什么就不过多解释了&#xff0c;因为一般需要…

flex 弹性布局

Flex 布局的使用 任何一个容器都可以指定为 Flex 布局。 .box{ display: flex; //flex作为display的一个属性使用 } 行内元素也可以使用 Flex 布局。 .box{ display: inline-flex; } 注意&#xff1a;设为 Flex 布局以后&#xff0c;子元素的float、clear和vertical-align…