深入理解 Vue 3 中的 emit
深入理解 Vue 3 中的 emit
在 Vue 3 中,组件通信是开发中非常重要的一部分,其中通过 emit 实现父子组件通信是最常见的方式之一。emit 的作用是:子组件可以通过触发自定义事件将数据传递给父组件。
在本篇文章中,我们将从以下几个方面详细讲解 emit 的使用:
- 基础概念
- 使用方法与语法
- 配合
props实现完整的父子通信 - 在 TypeScript 中的类型推断
- 注意事项与最佳实践
一、基础概念
什么是 emit?
emit 是 Vue 提供的一个方法,允许子组件通过事件触发的方式与父组件进行通信。父组件通过监听事件来响应子组件的行为。
使用场景
- 子组件通知父组件发生了某些行为(如按钮点击)。
- 子组件向父组件传递数据。
二、使用方法与语法
子组件中触发事件
在 setup 中,通过组件实例的 emit 函数触发事件。使用 defineProps 和 defineEmits 是 Vue 3 中推荐的组合式 API 语法。
示例代码
<!-- 子组件 -->
<script setup>
import { defineEmits } from 'vue';// 定义触发的事件及其数据类型
const emit = defineEmits(['update', 'delete']);// 触发事件
const handleUpdate = () => {emit('update', { id: 1, name: 'Vue 3' });
};const handleDelete = () => {emit('delete', 1); // 触发 delete 事件,传递一个 ID
};
</script><template><button @click="handleUpdate">更新</button><button @click="handleDelete">删除</button>
</template>
父组件中监听事件
<!-- 父组件 -->
<script setup>
import ChildComponent from './ChildComponent.vue';const handleUpdate = (data) => {console.log('更新事件触发:', data);
};const handleDelete = (id) => {console.log('删除事件触发,ID:', id);
};
</script><template><ChildComponent @update="handleUpdate" @delete="handleDelete" />
</template>
三、配合 props 实现完整父子通信
子组件与父组件完整通信流程
- 父组件通过
props将数据传递给子组件。 - 子组件通过
emit将事件通知给父组件。
示例代码
<!-- 子组件 -->
<script setup>
import { defineProps, defineEmits } from 'vue';// 定义 props 和 emit
const props = defineProps({value: String
});const emit = defineEmits(['input']);// 修改输入时触发 input 事件
const handleInput = (event) => {emit('input', event.target.value);
};
</script><template><input :value="value" @input="handleInput" />
</template>
<!-- 父组件 -->
<script setup>
import ChildComponent from './ChildComponent.vue';
import { ref } from 'vue';const inputValue = ref('初始值');const handleInput = (value) => {inputValue.value = value;
};
</script><template><ChildComponent :value="inputValue" @input="handleInput" /><p>父组件中的值:{{ inputValue }}</p>
</template>
四、在 TypeScript 中的类型推断
Vue 3 的组合式 API 提供了强大的类型支持。通过 defineEmits 和 defineProps,可以轻松为事件添加类型约束。
示例代码
<script setup lang="ts">
import { defineEmits, defineProps } from 'vue';// 定义 props 类型
interface Props {value: string;
}// 定义 emits 类型
type Emits = {(event: 'input', value: string): void;(event: 'delete'): void;
};const props = defineProps<Props>();
const emit = defineEmits<Emits>();// 使用 emit
const handleInput = (value: string) => {emit('input', value);
};const handleDelete = () => {emit('delete');
};
</script>
五、注意事项与最佳实践
-
事件名称统一采用
kebab-case格式:- 虽然 Vue 会自动处理大小写,但使用
kebab-case是推荐的实践,避免大小写不一致的问题。
emit('update-value'); // 推荐 emit('updateValue'); // 不推荐 - 虽然 Vue 会自动处理大小写,但使用
-
合理规划事件名称:
- 避免事件名称过于通用,确保具有上下文意义。例如,
update可以修改为update-user,使其更具描述性。
- 避免事件名称过于通用,确保具有上下文意义。例如,
-
避免过度依赖
emit:- 如果父组件过多依赖子组件的事件,可能导致父组件的逻辑复杂度增加。可以考虑使用 Vuex、Pinia 等状态管理工具。
-
事件参数的结构化:
- 如果需要传递多个参数,建议使用对象,这样更容易扩展和维护。
emit('update', { id: 1, name: 'Vue 3' }); // 推荐 emit('update', 1, 'Vue 3'); // 不推荐
六、总结
emit 是 Vue 3 中实现父子组件通信的核心工具,它的使用非常灵活,适合小型应用中的局部通信。搭配 props 使用,可以实现完整的数据流动。
在大型应用中,如果组件通信变得复杂,可以考虑其他的状态管理工具如 Pinia。希望本篇文章能够帮助你全面掌握 Vue 3 中的 emit!如果觉得文章有帮助,记得点赞和收藏! 🎉
相关文章:
深入理解 Vue 3 中的 emit
深入理解 Vue 3 中的 emit 在 Vue 3 中,组件通信是开发中非常重要的一部分,其中通过 emit 实现父子组件通信是最常见的方式之一。emit 的作用是:子组件可以通过触发自定义事件将数据传递给父组件。 在本篇文章中,我们将从以下几…...
#lwIP 的 Raw API 使用指南
1. 简介 lwIP(Lightweight IP)是一个为嵌入式系统设计的开源轻量级 TCP/IP 协议栈。它旨在提供尽可能小的内存占用和高效的性能,适用于资源受限的设备,如物联网设备、路由器和工业控制系统。lwIP 支持多种协议,包括 I…...
Elasticsearch开启认证及kibana密码登陆
Elasticsearch不允许root用户运行,使用root用户为其创建一个用户es,为用户es配置密码,并切换到es用户。 adduser elastic passwd elastic su elasticElasticsearch(简称ES)是一个基于Lucene的搜索服务器。它提供了一个分布式、多用户能力的全文搜索引擎,基于RESTful web…...
【论文阅读】Large Language Models for Equivalent Mutant Detection: How Far Are We?
阅读笔记:Large Language Models for Equivalent Mutant Detection: How Far Are We? 1. 来源出处 本文发表于《ISSTA’24, September 16–20, 2024, Vienna, Austria》会议,由Zhao Tian, Honglin Shu, Dong Wang, Xuejie Cao, Yasutaka Kamei和Junji…...
vue2 面试题带答案,万字总结
1. 什么是 vue Vue 是一套用于构建用户界面的渐进式框架。Vue.js 的主要特点:渐进式框架、声明式渲染、组件化、响应式数据绑定等; 2、MVC 和 MVVM 区别 MVC 是模型(model)-视图(view)-控制器(controller),控制器负责…...
git的常用用法(最简精华版)
一、工作区域(工作区,暂存区,本地仓库) 1、工作区 当前正在使用的文件 2、暂存区 已使用add命令提交的工作区的文件,会保存到暂存区 3、本地仓库 已使用commit命令提交的暂存区的文件,会保存到本地仓库。…...
哥德巴赫猜想渐行渐远
我现在的工作,表明经典分析可能出了问题,如此则连Vinogradov的三素数定理都不成立了,更别说基于L-函数方程的陈氏定理“12”了。事实上即使L-函数方程成立,由于我指出Siegel定理不成立,陈景润和张益唐的工作就不成立。…...
Spring Boot应用开发实战:构建高效、可维护的Web应用
Spring Boot应用开发实战:构建高效、可维护的Web应用 在当今快速迭代的软件开发环境中,Spring Boot凭借其“约定优于配置”的理念,迅速成为Java开发者构建微服务及Web应用的首选框架。它不仅简化了Spring应用的初始搭建以及开发过程,还通过自动配置、嵌入式服务器等特性,…...
keep-alive多级页面缓存实现
文章目录 keep-alive多级页面缓存实现只适用于页面是否缓存状态不变的情况对于上面的问题提供一种解决方案 keep-alive多级页面缓存实现 只适用于页面是否缓存状态不变的情况 网上有一种很普遍的教程,不使用keep-alive的include属性,而是通过在路由表中…...
ks 小程序sig3
前言 搞了app版的快手之后 (被风控麻了) 于是试下vx小程序版的 抓包调试 小程序抓包问题 网上很多教程, github也有开源的工具代码 自行搜索 因为我们需要调试代码,所以就用了下开源的工具 (可以用chrome的F12功能&a…...
图论之构造完全图
题目 2398: 信息学奥赛一本通T1489-构造完全图 时间限制: 2s 内存限制: 192MB 提交: 16 解决: 9 题目描述 对于完全图 G,若有且仅有一棵最小生成树为 T,则称完全图 G 是树 T 扩展出的。 给你一棵树 T,找出 T 能扩展出的边权和最小的完全图 G…...
RDD触发算子:一些常用的触发算子(count、foreach、saveAsTextFile、first)
文章目录 1、count算子功能语法 2、foreach算子功能语法 3、saveAsTextFile算子功能语法 4、first算子功能语法举例 1、count算子 功能 统计RDD集合中元素的个数,返回一个int值 语法 def count(self) -> int2、foreach算子 功能 对RDD中每个元素调用一次参数中…...
搭建RAGFlow
RAGFlow 是一款基于深度文档理解构建的开源 RAG(Retrieval-Augmented Generation)引擎。RAGFlow 可以为各种规模的企业及个人提供一套精简的 RAG 工作流程,结合大语言模型(LLM)针对用户各类不同的复杂格式数据提供可靠…...
css中的box-sizing,记录
border-box:最终高度为height,默认包含padding border等属性 content-box:box-sizing默认值,最终大小为heightpaddingborder 等...
使用useCallback引发对闭包的理解
一、先简单介绍一下闭包: 闭包是 JavaScript 中的重要概念,它指的是一个函数可以“记住”并访问其词法作用域,即使在这个函数的外部被执行。简单来说,闭包是由函数及其相关的环境组合而成的。 闭包的特性 函数内部可以访问外部变量: 闭包…...
gvim添加至右键、永久修改配置、放大缩小快捷键、ctrl + c ctrl +v 直接复制粘贴、右键和还原以前版本(V)冲突
一、将 vim 添加至右键 进入安装目录找到 vim91\install.exe 管理员权限执行 Install will do for you:1 Install .bat files to use Vim at the command line:2 Overwrite C:\Windows\vim.bat3 Overwrite C:\Windows\gvim.bat4 Overwrite C:\Windows\evim.bat…...
腾讯云-COS
COS 对象存储 是一种可扩展的云端数据存储服务。它适用于存储任意类型的文件,并且可以针对这些文件进行访问控制。 CORS 跨域资源共享 是一种机制,它使用额外的HTTP头来告诉浏览器允许一个域上的Web应用请求另一个域上的资源。当需要从一个域名下的网页向…...
蓝桥杯每日真题 - 第16天
题目:(卡牌) 题目描述(13届 C&C B组C题) 解题思路: 题目分析: 有 n 种卡牌,每种卡牌的现有数量为 a[i],所需的最大数量为 b[i],还有 m 张空白卡牌。 每…...
基因组之全局互作热图可视化
引言 PlotHiC 是一个专为 Hi-C 数据可视化分析而设计的 Python 包。Hi-C 技术是一种能够检测染色体三维结构的实验方法,它能揭示 DNA 在细胞核内的三维组织结构。为了更好地展示和解释这些复杂的数据,PlotHiC[1] 可以帮助用户方便地绘制Hi-C 数据的热图。…...
基于Lora通讯加STM32空气质量检测WIFI通讯
目录 目录 前言 一、本设计主要实现哪些很“开门”功能? 二、电路设计原理图 1.电路图采用Altium Designer进行设计: 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 随着环境污染问题的日益严重,空气质量的监测与管理已经…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
跨平台商品数据接口的标准化与规范化发展路径:淘宝京东拼多多的最新实践
在电商行业蓬勃发展的当下,多平台运营已成为众多商家的必然选择。然而,不同电商平台在商品数据接口方面存在差异,导致商家在跨平台运营时面临诸多挑战,如数据对接困难、运营效率低下、用户体验不一致等。跨平台商品数据接口的标准…...
游戏开发中常见的战斗数值英文缩写对照表
游戏开发中常见的战斗数值英文缩写对照表 基础属性(Basic Attributes) 缩写英文全称中文释义常见使用场景HPHit Points / Health Points生命值角色生存状态MPMana Points / Magic Points魔法值技能释放资源SPStamina Points体力值动作消耗资源APAction…...
【Vue】scoped+组件通信+props校验
【scoped作用及原理】 【作用】 默认写在组件中style的样式会全局生效, 因此很容易造成多个组件之间的样式冲突问题 故而可以给组件加上scoped 属性, 令样式只作用于当前组件的标签 作用:防止不同vue组件样式污染 【原理】 给组件加上scoped 属性后…...
python打卡第48天
知识点回顾: 随机张量的生成:torch.randn函数卷积和池化的计算公式(可以不掌握,会自动计算的)pytorch的广播机制:加法和乘法的广播机制 ps:numpy运算也有类似的广播机制,基本一致 **…...
MySQL间隙锁入手,拿下间隙锁面试与实操
一、MySQL 间隙锁,究竟是什么? 在 MySQL 的世界里,间隙锁(Gap Lock)就像是一个默默守护数据一致性的卫士,看似低调,却在并发控制中扮演着至关重要的角色。 想象一下,你去图书馆借…...
Java线程池核心原理与最佳实践
Java 线程池详解 线程池是Java并发编程的核心组件,它能高效管理线程生命周期,避免频繁创建销毁线程的开销,提升系统性能和资源利用率。 一、线程池核心优势 降低资源消耗:复用已创建的线程,减少线程创建销毁开销提高…...
