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

Vue 3 的 emit 简单使用

在 Vue 3 中使用 emit,子组件可以将事件通知父组件,父组件可以在响应这些事件时执行特定的逻辑。

emit 是一种非常灵活的通信方式,允许组件之间以解耦的方式进行交互。

1. 基本用法

1、使用 defineEmits

子组件

<template><div style="border: 1px solid orange"><p>Child</p><button @click="handleClick" style="border: none;">Click Me</button></div>
</template><script setup>
import { defineEmits } from 'vue'
const emit = defineEmits(['update']) // 定义事件
const handleClick = () => {emit('update', 'newValue') // 触发 'update' 事件,并传递参数
}
</script>

父组件

<template><div style="border: 1px solid red"><p>Father</p><Child @update="handleUpdate" /></div>
</template><script setup>
import Child from './Child.vue'const handleUpdate = (value) => {console.log('Received from child:', value)
}
</script>

2、在模板中直接使用 emit 

子组件

<template><div style="border: 1px solid orange"><p>Child</p><button @click="$emit('update', 'newValue')" style="border: none;">Click Me</button></div>
</template>

父组件不变 

3、在 JSX/TSX 中使用 emit 

子组件

import { defineComponent } from 'vue';export default defineComponent({setup(_, { emit }) {const handleClick = () => {emit('update', 'newValue');};return () => (<div style="border: 1px solid orange"><p>Child</p><button style="border: none;" onClick={handleClick}>Click Me</button></div>);}
});

父组件

import { defineComponent } from 'vue';
import Child from './Child';const Father = defineComponent({setup() {const handleUpdate = (value) => {console.log('Received from child:', value)}return () => (<div style="border: 1px solid red"><p>Father</p><Child onUpdate={handleUpdate} /></div>);},
});export default Father;

2. 举例 🌰

子组件

import { defineComponent } from 'vue';const Child = defineComponent({props: ['label', 'message'],emits: {'update': (value: string) => typeof value === 'string','click': null,},setup(props, { emit }) {const emitEvent = () => {emit('update', 'Hello from Child!');emit('click');};return () =><div style={{ border: '1px solid pink' }}><h3>Child Component Content</h3><button onClick={emitEvent} style={{ border: 'none' }}>{props.label}</button><div>props.message:{props.message}</div></div>},
});export default Child;

父组件

import { defineComponent, ref } from 'vue';
import Child from './Child';const Father = defineComponent({setup() {const date = ref('2024-08-21');const handleUpdate = (target: string) => {console.log('Update event received:', target);};const handleClick = () => {console.log('Click event received');};return () => (<div><Child label="Click Me" message={date.value} onUpdate={handleUpdate} onClick={handleClick} /></div>);},
});export default Father;

父组件向子组件传递数据,子组件使用 prop 接收,进而展示到页面。

子组件向父组件抛出事件 emit,并且可以传递参数,父组件使用 onXXX 来监听子组件触发的事件。比如 onUpdate 和 onClick 事件。

3. 注意事项

1、事件名称区分大小写

Vue 3 中的事件名称是区分大小写的。这意味着 @update 和 @Update 是两个不同的事件名称。在子组件和父组件中,确保事件名称的一致性非常重要。

2、事件参数传递

使用 emit 可以传递多个参数,这些参数将在父组件中对应的事件处理函数中接收到,并且需要按照顺序正确接收它们。

// 子组件
emit('update', 'value1', 'value2');// 父组件
<Child @update="handleUpdate" /><script setup>
const handleUpdate = (param1, param2) => {console.log(param1, param2); // param1 = 'value1', param2 = 'value2'
};
</script>

3、事件参数类型

在使用 TypeScript 时,defineEmits 可以定义事件和参数的类型。不仅可以提高代码的安全性,还能在开发过程中获得更好的类型提示。

const emit = defineEmits<{ (event: 'update', value: string): void }>();emit('update', 'newValue'); // 正确
emit('update', 123); // 错误,类型不匹配

4、确保事件已声明

通过 defineEmits 定义子组件中的事件时,要确保所有可能触发的事件都已声明。未声明的事件将无法通过 emit 触发。

const emit = defineEmits(['update', 'delete']);emit('update', 'newValue'); // 正确
emit('delete'); // 正确
emit('add'); // 错误,未声明 'add' 事件

5、避免滥用事件

在设计组件时,尽量减少事件的种类和数量,尤其是在组件树较为复杂时。过多的事件可能导致代码难以维护和调试。

相关文章:

Vue 3 的 emit 简单使用

在 Vue 3 中使用 emit&#xff0c;子组件可以将事件通知父组件&#xff0c;父组件可以在响应这些事件时执行特定的逻辑。 emit 是一种非常灵活的通信方式&#xff0c;允许组件之间以解耦的方式进行交互。 1. 基本用法 1、使用 defineEmits 子组件 <template><div…...

java在实际开发中反常识bug

目录 1.背景 2.案例 1.包装类型拆箱导致空指针异常 2.switch传入null,导致空指针异常 3.Arrays.asList添加异常 4.转BigDecimal类型时精度丢失 5.除以0不一定抛异常 6.Steam filter后集合修改,会修改原数据 3.完美&评论 1.背景 这篇博客,将列举本人在实际开发中看…...

java多线程(三)重排序与Happens-Before

一、重排序 1.1 指令重排定义和含义 定义&#xff1a;重排序是指编译器和处理器为了提高程序执行效率&#xff0c;在不改变单线程程序执行结果的前提下&#xff0c;对指令执行顺序进行重新排列的一种优化手段。 重排序可以发生在编译器优化阶段&#xff0c;也可以发生在处理…...

RUST知识框架与学习框架

RUST知识框架与学习框架 Rust是一门系统级编程语言&#xff0c;以其内存安全、高性能和并发性而著称&#xff0c;特别适用于开发低级系统、网络服务和并发应用&#xff0c;具有广泛应用前景。 一、Rust知识框架 基础语法与核心概念 变量与类型&#xff1a;包括基本数据类型、…...

git cherry-pick命令使用分享

在日常开发中&#xff0c;有时候会遇到一种情况&#xff0c;线上出了问题&#xff0c;但是现在的预生产环境&#xff08;Pre-production Environment&#xff09;或准生产环境&#xff08;Stage Environment&#xff09;有还未通过验收的内容&#xff0c;那么想进行修复可以选择…...

关闭Chrome快捷键

chrome是没办法改变快捷键以及屏蔽快捷键的&#xff0c;需要安装插件&#xff1a;shortkey 保证插件是开启的 不用做其他设置所有快捷键已被关闭...

常见DDoS攻击之零日漏洞Zero-day Attacks

目录 一、什么是零日漏洞Zero-day Attacks 二、零日漏洞是如何转化为零日攻击的 三、常见的零日攻击类型 四、为什么零日攻击很危险 五、著名的零日攻击事件 六、如何降低零日攻击的风险 七、DDoS攻击防御解决方案&#xff08;定制化&#xff09; 7.1 产品优势 7.2 产品…...

【字符串】Z函数 - 模板

z [ i ] z[i] z[i] 表示字符串 s s s 和 s [ i , n − 1 ] s[i,\ n - 1] s[i, n−1] 的最长前缀的长度&#xff0c;特别的&#xff0c; z [ 0 ] 0 z[0]0 z[0]0 // *********Z函数************** // - 时间复杂度 O(n) vector<int> z_function(string s) {int n (int…...

MySQL范围分区分区表

什么是范围分区分区表&#xff1f; 范围分区是一种根据某个列的范围值来分割表数据的分区方式。在范围分区中&#xff0c;每个分区都有自己的范围条件&#xff0c;当插入数据时&#xff0c;MySQL会根据指定的范围条件将数据分配到相应的分区中。这种分区方式可以使得表的数据按…...

网络UDP报文详细解析

目录 一、简介二、详细介绍三、其他相关链接1、TCP报文段的详细图总结2、TCP三次握手和四次挥手详解3、socket通信原理及相关函数详细总结4、网络包IP首部详细解析 一、简介 本文主要介绍UDP报文格式。 二、详细介绍 UDP是一种无连接、不可靠的用户数据报协议&#xff0c;其…...

望繁信科技入选2024年第3批上海市高新技术成果转化项目名单

近日&#xff0c;上海望繁信科技有限公司&#xff08;以下简称“望繁信科技”&#xff09;凭借其自主研发的“数字北极星流程挖掘分析软件”项目&#xff0c;成功入选2024年第3批上海市高新技术成果转化项目名单。这一殊荣根据《上海市高新技术成果转化项目认定办法》&#xff…...

深入探讨MySQL的锁机制:全局锁、表级锁和行级锁

深入探讨MySQL的锁机制&#xff1a;全局锁、表级锁和行级锁 在数据库管理中&#xff0c;锁机制是确保数据一致性和并发控制的重要手段。MySQL提供了多种锁策略&#xff0c;包括全局锁、表级锁和行级锁。本文将详细探讨这些锁机制的概念、使用场景及其示例代码&#xff0c;帮助…...

iLogtail 开源两周年:感恩遇见,畅想未来

早在上世纪 60 年代&#xff0c;早期的计算机&#xff08;例如 ENIAC 和 IBM 的大型机&#xff09;在操作过程中会输出一些基本的状态信息和错误报告&#xff0c;这些记录通常通过打印机输出到纸带或纸卡上&#xff0c;用于跟踪操作流程和调试&#xff0c;最早期的日志系统借此…...

写给大数据开发:在Databricks中自定义函数

你是否曾经在处理海量数据时感到力不从心?是否在重复编写相似代码时感到厌烦?如果是,那么Databricks中的自定义函数可能就是你一直在寻找的救星。在接下来的5分钟里,让我们一起探索如何利用这个强大的工具来revolutionize你的大数据开发工作流程。 目录 为什么要在Databrick…...

VMware vSphere Client无法访问和连接ESXi虚拟主机解决思路

文章目录 前言1. 问题现象2. 问题原因3. 解决方法4. 参考文章 前言 注意 : 可以先看看参考文章那里&#xff0c;在回过来看 1 、 2 、3 1. 问题现象 版本&#xff1a;VMware vCenter Server 5.5.0 build-2442329 问题描述&#xff1a;用VMware vSphere Client 登录ESXI主机出…...

实现Kruskal算法连通游戏地图地牢

前置知识 c分享&#xff5c;并查集从入门到出门 - 力扣&#xff08;LeetCode&#xff09; 彻底搞懂克鲁斯卡尔&#xff08;Kruskal&#xff09;算法&#xff08;附C代码实现&#xff09; - QuanHa - 博客园 (cnblogs.com) 白色点矩形是地牢&#xff0c;其中白线是按照krsukal…...

turtle画图知识

Turtle库是Python编程语言中的一个库&#xff0c;用于创建各种类型的图形&#xff0c;包括简单圆形、线条、路径和图片。它支持多种图形类型&#xff0c;并且可以绘制出各种复杂的形状。 以下是一些基本的使用方法&#xff1a; 1. 创建一个新的Turtle对象&#xff1a; pytho…...

Elasticsearch简述

Elasticsearch简述 Elasticsearch产品介绍 Elasticsearch是一个基于Apache Lucene的开源的分布式搜索和分析引擎,设计用于云计算中,能够快速处理大量数据。它能够近实时地进行复杂的查询,并且可以用于全文检索、结构化搜索以及分析。Elasticsearch具有以下特性: 分布式搜索…...

SQL— DDL语句学习【后端 9】

SQL— DDL语句学习 在数据管理的广阔领域中&#xff0c;SQL&#xff08;Structured Query Language&#xff09;作为操作关系型数据库的编程语言&#xff0c;扮演着举足轻重的角色。它不仅定义了操作所有关系型数据库的统一标准&#xff0c;还为我们提供了强大的工具来管理、查…...

线程池介绍

1.线程池简介 import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class CallableDemo {public sta…...

【esp32使用jtag下载和调试 Can‘t perform JTAG flash, because OpenOCD server is not running!】

ESP-IDF使用USB的JTAG下载调试时报错现象。 2026年初尝试了很多方法jtag下载&#xff0c;网上很多资料都有问题&#xff0c;以下实操烧录成功过程记录。 提示&#xff1a; Can’t perform JTAG flash, because OpenOCD server is not running! ❌ Error: libusb_open() faile…...

用Verilog手搓一个IEEE754浮点加法器:从状态机设计到FPGA上板验证(附完整代码)

从零构建IEEE754浮点加法器&#xff1a;Verilog状态机设计与FPGA实战全解析 1. 浮点运算器的工程实现挑战 在数字信号处理和高性能计算领域&#xff0c;浮点运算器一直是核心组件。与整数运算不同&#xff0c;浮点数的特殊存储格式使得其运算过程复杂得多。IEEE754标准定义了浮…...

KRM库:Arduino嵌入式运动控制的安全映射与非阻塞调度

1. KRM库概述&#xff1a;面向嵌入式运动控制的Arduino实用工具集KRM&#xff08;Koval Robotics & Motion&#xff09;是一个专为Arduino平台设计的轻量级底层工具库&#xff0c;其核心定位并非通用算法封装&#xff0c;而是聚焦于机器人与机电控制系统开发中高频、重复、…...

3步掌握BilibiliDown:从视频下载到音频提取的完整攻略

3步掌握BilibiliDown&#xff1a;从视频下载到音频提取的完整攻略 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址: https://gitcode.com/gh_mirrors/b…...

破局足球数据分析困境:Understat工具的技术赋能与实战应用

破局足球数据分析困境&#xff1a;Understat工具的技术赋能与实战应用 【免费下载链接】understat An asynchronous Python package for https://understat.com/. 项目地址: https://gitcode.com/gh_mirrors/un/understat 问题发现&#xff1a;足球数据分析的三重技术壁…...

计算机毕业设计:Python二手车市场数据分析与价格预测系统 Django框架 随机森林 可视化 数据分析 汽车 车辆 大数据 hadoop(建议收藏)✅

1、项目介绍 技术栈 Python、Django、MySQL、机器学习随机森林算法、Echarts可视化、HTML、阿里云天池数据集 功能模块 注册登录界面不同车龄平均价格柱状图分析不同车龄数量分布饼图二手车售价分布饼图不同地区二手车平均价格柱状图分析里程价格折线图分析特征值和价格相关性分…...

终极指南:ImagePicker资源解析机制如何高效处理图像资源

终极指南&#xff1a;ImagePicker资源解析机制如何高效处理图像资源 【免费下载链接】ImagePicker :camera: Reinventing the way ImagePicker works. 项目地址: https://gitcode.com/gh_mirrors/im/ImagePicker ImagePicker作为一款重新定义图片选择体验的工具&#xf…...

E-Hentai-Downloader:高效漫画资源本地化解决方案

E-Hentai-Downloader&#xff1a;高效漫画资源本地化解决方案 【免费下载链接】E-Hentai-Downloader Download E-Hentai archive as zip file 项目地址: https://gitcode.com/gh_mirrors/eh/E-Hentai-Downloader 核心价值&#xff1a;重新定义漫画资源管理 E-Hentai-Do…...

TikTok音乐提取全攻略:3分钟学会用DouK-Downloader分离音频

TikTok音乐提取全攻略&#xff1a;3分钟学会用DouK-Downloader分离音频 【免费下载链接】TikTokDownloader JoeanAmier/TikTokDownloader: 这是一个用于从TikTok下载视频和音频的工具。适合用于需要从TikTok下载视频和音频的场景。特点&#xff1a;易于使用&#xff0c;支持多种…...

EcomGPT-7B电商大模型Java八股文实践:面试级电商系统设计题解析

EcomGPT-7B电商大模型Java八股文实践&#xff1a;面试级电商系统设计题解析 最近在技术社区里&#xff0c;看到不少朋友在讨论一个挺有意思的电商大模型——EcomGPT-7B。它不像那些通用的聊天模型&#xff0c;而是专门针对电商领域训练出来的。我就在想&#xff0c;如果用它来…...