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

深入理解 Vue 3 中的 emit

深入理解 Vue 3 中的 emit

在 Vue 3 中,组件通信是开发中非常重要的一部分,其中通过 emit 实现父子组件通信是最常见的方式之一。emit 的作用是:子组件可以通过触发自定义事件将数据传递给父组件

在本篇文章中,我们将从以下几个方面详细讲解 emit 的使用:

  • 基础概念
  • 使用方法与语法
  • 配合 props 实现完整的父子通信
  • 在 TypeScript 中的类型推断
  • 注意事项与最佳实践

一、基础概念

什么是 emit

emit 是 Vue 提供的一个方法,允许子组件通过事件触发的方式与父组件进行通信。父组件通过监听事件来响应子组件的行为。

使用场景

  1. 子组件通知父组件发生了某些行为(如按钮点击)。
  2. 子组件向父组件传递数据。

二、使用方法与语法

子组件中触发事件

setup 中,通过组件实例的 emit 函数触发事件。使用 definePropsdefineEmits 是 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 实现完整父子通信

子组件与父组件完整通信流程

  1. 父组件通过 props 将数据传递给子组件
  2. 子组件通过 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 提供了强大的类型支持。通过 defineEmitsdefineProps,可以轻松为事件添加类型约束。

示例代码

<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>

五、注意事项与最佳实践

  1. 事件名称统一采用 kebab-case 格式

    • 虽然 Vue 会自动处理大小写,但使用 kebab-case 是推荐的实践,避免大小写不一致的问题。
    emit('update-value'); // 推荐
    emit('updateValue'); // 不推荐
    
  2. 合理规划事件名称

    • 避免事件名称过于通用,确保具有上下文意义。例如,update 可以修改为 update-user,使其更具描述性。
  3. 避免过度依赖 emit

    • 如果父组件过多依赖子组件的事件,可能导致父组件的逻辑复杂度增加。可以考虑使用 Vuex、Pinia 等状态管理工具。
  4. 事件参数的结构化

    • 如果需要传递多个参数,建议使用对象,这样更容易扩展和维护。
    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 中&#xff0c;组件通信是开发中非常重要的一部分&#xff0c;其中通过 emit 实现父子组件通信是最常见的方式之一。emit 的作用是&#xff1a;子组件可以通过触发自定义事件将数据传递给父组件。 在本篇文章中&#xff0c;我们将从以下几…...

#lwIP 的 Raw API 使用指南

1. 简介 lwIP&#xff08;Lightweight IP&#xff09;是一个为嵌入式系统设计的开源轻量级 TCP/IP 协议栈。它旨在提供尽可能小的内存占用和高效的性能&#xff0c;适用于资源受限的设备&#xff0c;如物联网设备、路由器和工业控制系统。lwIP 支持多种协议&#xff0c;包括 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?

阅读笔记&#xff1a;Large Language Models for Equivalent Mutant Detection: How Far Are We? 1. 来源出处 本文发表于《ISSTA’24, September 16–20, 2024, Vienna, Austria》会议&#xff0c;由Zhao Tian, Honglin Shu, Dong Wang, Xuejie Cao, Yasutaka Kamei和Junji…...

vue2 面试题带答案,万字总结

1. 什么是 vue Vue 是一套用于构建用户界面的渐进式框架。Vue.js 的主要特点&#xff1a;渐进式框架、声明式渲染、组件化、响应式数据绑定等&#xff1b; 2、MVC 和 MVVM 区别 MVC 是模型(model)&#xff0d;视图(view)&#xff0d;控制器(controller)&#xff0c;控制器负责…...

git的常用用法(最简精华版)

一、工作区域&#xff08;工作区&#xff0c;暂存区&#xff0c;本地仓库&#xff09; 1、工作区 当前正在使用的文件 2、暂存区 已使用add命令提交的工作区的文件&#xff0c;会保存到暂存区 3、本地仓库 已使用commit命令提交的暂存区的文件&#xff0c;会保存到本地仓库。…...

哥德巴赫猜想渐行渐远

我现在的工作&#xff0c;表明经典分析可能出了问题&#xff0c;如此则连Vinogradov的三素数定理都不成立了&#xff0c;更别说基于L-函数方程的陈氏定理“12”了。事实上即使L-函数方程成立&#xff0c;由于我指出Siegel定理不成立&#xff0c;陈景润和张益唐的工作就不成立。…...

Spring Boot应用开发实战:构建高效、可维护的Web应用

Spring Boot应用开发实战:构建高效、可维护的Web应用 在当今快速迭代的软件开发环境中,Spring Boot凭借其“约定优于配置”的理念,迅速成为Java开发者构建微服务及Web应用的首选框架。它不仅简化了Spring应用的初始搭建以及开发过程,还通过自动配置、嵌入式服务器等特性,…...

keep-alive多级页面缓存实现

文章目录 keep-alive多级页面缓存实现只适用于页面是否缓存状态不变的情况对于上面的问题提供一种解决方案 keep-alive多级页面缓存实现 只适用于页面是否缓存状态不变的情况 网上有一种很普遍的教程&#xff0c;不使用keep-alive的include属性&#xff0c;而是通过在路由表中…...

ks 小程序sig3

前言 搞了app版的快手之后 &#xff08;被风控麻了&#xff09; 于是试下vx小程序版的 抓包调试 小程序抓包问题 网上很多教程&#xff0c; github也有开源的工具代码 自行搜索 因为我们需要调试代码&#xff0c;所以就用了下开源的工具 &#xff08;可以用chrome的F12功能&a…...

图论之构造完全图

题目 2398: 信息学奥赛一本通T1489-构造完全图 时间限制: 2s 内存限制: 192MB 提交: 16 解决: 9 题目描述 对于完全图 G&#xff0c;若有且仅有一棵最小生成树为 T&#xff0c;则称完全图 G 是树 T 扩展出的。 给你一棵树 T&#xff0c;找出 T 能扩展出的边权和最小的完全图 G…...

RDD触发算子:一些常用的触发算子(count、foreach、saveAsTextFile、first)

文章目录 1、count算子功能语法 2、foreach算子功能语法 3、saveAsTextFile算子功能语法 4、first算子功能语法举例 1、count算子 功能 统计RDD集合中元素的个数&#xff0c;返回一个int值 语法 def count(self) -> int2、foreach算子 功能 对RDD中每个元素调用一次参数中…...

搭建RAGFlow

RAGFlow 是一款基于深度文档理解构建的开源 RAG&#xff08;Retrieval-Augmented Generation&#xff09;引擎。RAGFlow 可以为各种规模的企业及个人提供一套精简的 RAG 工作流程&#xff0c;结合大语言模型&#xff08;LLM&#xff09;针对用户各类不同的复杂格式数据提供可靠…...

css中的box-sizing,记录

border-box&#xff1a;最终高度为height&#xff0c;默认包含padding border等属性 content-box&#xff1a;box-sizing默认值&#xff0c;最终大小为heightpaddingborder 等...

使用useCallback引发对闭包的理解

一、先简单介绍一下闭包: 闭包是 JavaScript 中的重要概念&#xff0c;它指的是一个函数可以“记住”并访问其词法作用域&#xff0c;即使在这个函数的外部被执行。简单来说&#xff0c;闭包是由函数及其相关的环境组合而成的。 闭包的特性 函数内部可以访问外部变量: 闭包…...

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 对象存储 是一种可扩展的云端数据存储服务。它适用于存储任意类型的文件&#xff0c;并且可以针对这些文件进行访问控制。 CORS 跨域资源共享 是一种机制&#xff0c;它使用额外的HTTP头来告诉浏览器允许一个域上的Web应用请求另一个域上的资源。当需要从一个域名下的网页向…...

蓝桥杯每日真题 - 第16天

题目&#xff1a;&#xff08;卡牌&#xff09; 题目描述&#xff08;13届 C&C B组C题&#xff09; 解题思路&#xff1a; 题目分析&#xff1a; 有 n 种卡牌&#xff0c;每种卡牌的现有数量为 a[i]&#xff0c;所需的最大数量为 b[i]&#xff0c;还有 m 张空白卡牌。 每…...

基因组之全局互作热图可视化

引言 PlotHiC 是一个专为 Hi-C 数据可视化分析而设计的 Python 包。Hi-C 技术是一种能够检测染色体三维结构的实验方法&#xff0c;它能揭示 DNA 在细胞核内的三维组织结构。为了更好地展示和解释这些复杂的数据&#xff0c;PlotHiC[1] 可以帮助用户方便地绘制Hi-C 数据的热图。…...

基于Lora通讯加STM32空气质量检测WIFI通讯

目录 目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 1.电路图采用Altium Designer进行设计&#xff1a; 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 随着环境污染问题的日益严重&#xff0c;空气质量的监测与管理已经…...

半导体行业成本管理:从学习曲线到EDA工具链的实战策略

1. 行业成本与价格压力的永恒博弈在半导体这个行当里干了十几年&#xff0c;我越来越觉得&#xff0c;我们这行最核心的生存法则&#xff0c;不是什么高深莫测的量子物理&#xff0c;而是一个看似简单、实则残酷的算术题&#xff1a;一边是不断上涨的原材料、设备和设计成本&am…...

Blender 3MF插件:终极3D打印工作流解决方案

Blender 3MF插件&#xff1a;终极3D打印工作流解决方案 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 在3D打印的世界里&#xff0c;你是否曾为文件格式转换而头疼&…...

Go语言Envoy实战:高性能代理与负载均衡

Go语言Envoy实战&#xff1a;高性能代理与负载均衡 1. Envoy概述 Envoy是Lyft开源的高性能代理&#xff0c;常作为服务网格的数据平面&#xff0c;提供负载均衡、熔断、重试等功能。 2. Go控制平面实现 package envoyimport ("api/envoy/api/v2/core""api/envoy…...

5G双连接(EN-DC):开启5G网络融合新体验

5G双连接&#xff08;EN-DC&#xff09;&#xff1a;开启5G网络融合新体验 在5G网络快速发展的进程中&#xff0c;5G双连接&#xff08;EN-DC&#xff09;技术逐渐成为行业内关注的焦点。它作为5G网络架构中的一项关键技术&#xff0c;为提升网络性能、优化用户体验发挥着重要作…...

HarmonyOS 6.0 跨端页面构建实践:从 UI 代码到热力交互卡片设计

HarmonyOS 6.0 跨端页面构建实践&#xff1a;从 UI 代码到热力交互卡片设计 前言 在 HarmonyOS 6.0 的跨端开发体系中&#xff0c;页面构建的核心目标已经从“能运行”逐步转向“高一致性体验 低成本跨端复用”。尤其是在多设备协同的场景下&#xff0c;一个 UI 组件不仅要适配…...

前端工程化:代码审查最佳实践

前端工程化&#xff1a;代码审查最佳实践 前言 代码审查是保障代码质量的第一道防线。一个好的代码审查流程不仅能发现潜在的bug&#xff0c;还能促进团队知识共享&#xff0c;提升整体代码水平。今天我就来给大家讲讲如何建立一套高效的代码审查流程。 什么是代码审查 代码审查…...

基于有限状态机的LLM智能体:Haath架构解析与工程实践

1. 项目概述&#xff1a;一个基于状态机的自主LLM智能体如果你正在构建或使用LLM智能体&#xff0c;大概率遇到过这样的困境&#xff1a;你把所有能调用的工具、API、函数都一股脑儿塞给模型&#xff0c;然后满怀期待地发出指令。结果呢&#xff1f;模型要么在几十个选项里犹豫…...

定点FIR滤波器实现:系数量化与嵌入式优化

1. 定点FIR滤波器实现的核心挑战在数字信号处理领域&#xff0c;有限脉冲响应(FIR)滤波器因其绝对稳定性成为基础构建模块。与IIR滤波器不同&#xff0c;FIR系统仅依赖于当前和过去的输入样本&#xff0c;其传递函数不包含反馈回路。这种特性使得FIR滤波器在需要线性相位响应的…...

AI重构职场,30岁已成人生分水岭:程序员的两种人生与一种新活法

AI重构职场&#xff0c;30岁已成人生分水岭&#xff1a;程序员的两种人生与一种新活法在AI写下50%代码的2026年&#xff0c;30岁不再只是年龄数字&#xff0c;而是划分两种职业生涯、两种生活状态的分界线。2026年3月的一个周五晚上&#xff0c;29岁的杭州后端工程师李明&#…...

AI代理协作平台agtx:用终端看板管理多AI编程工作流

1. 项目概述&#xff1a;一个能管理其他AI编程代理的终端看板如果你和我一样&#xff0c;每天要在Claude、Cursor、Codex这些AI编程工具之间来回切换&#xff0c;同时处理多个功能需求&#xff0c;那你肯定也经历过这种混乱&#xff1a;一个终端窗口里&#xff0c;Claude正在写…...