深入理解 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!如果觉得文章有帮助,记得点赞和收藏! 🎉

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

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

相关文章

C++结构型设计模式之适配器模式概述

适配器模式的意图和动机 意图&#xff1a;适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;其意图是将一个类的接口转换成客户端所期望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的类可以协同工作。 动机&#xff1a…

网安瞭望台第2期:零日漏洞密集爆发、2024年常见网络安全漏洞类型及分析

国内外要闻 Ubuntu 服务器 Needrestart 软件包惊现严重安全漏洞 近日&#xff0c;Ubuntu 服务器&#xff08;自 21.04 版本起默认安装&#xff09;的 Needrestart 软件包被曝存在多个可追溯至数十年前的安全漏洞。这些漏洞允许本地攻击者在无需用户交互的情况下获取根…

【Linux】apt 关闭 ssl 认证

【注意】apt 关闭 ssl 认证可能会引起软件安装风险&#xff0c;请尽量避免关闭。 执行以下命令可以实现全局关闭 sll 验证。 echo Acquire::https::Verify-Peer "false"; >> /etc/apt/apt.conf.d/99disable-signature-verificationecho Acquire::https::Verif…

Java前端基础——CSS

一、CSS介绍 1.1 什么是CSS CSS(Cascading Style Sheet)&#xff0c;层叠样式表,用于控制页面的样式. CSS 能够对网页中元素位置的排版进行像素级精确控制, 实现美化页面的效果. 能够做到页面的样式和结构分离. 1.2 基本语法规范 选择器 {⼀条/N条声明} • 选择器决定针…

浅议Flink中的通讯工具: Akka

在Flink中&#xff0c;各个组件之间需要频繁交换数据和控制信息。Flink选择了基于Actor模型的Akka框架作为通信基础。 Akka是什么 Actor模型 Actor模型是用于单个进程中并发的场景。 在Actor模型中&#xff1a; ActorSystem负责管理actor生命周期 将每个实体视为独立的 Ac…

Java-05 深入浅出 MyBatis - 配置深入 动态 SQL 参数、循环、片段

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大数据篇正在更新&#xff01;https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了&#xff1a; MyBatis&#xff…

Vue.js 自定义指令:从零开始创建自己的指令

vue使用directive 前言vue2使用vue3使用 前言 关于使用自定义指令在官网中是这样描述的 vue2:对普通 DOM 元素进行底层操作&#xff0c;这时候就会用到自定义指令。 vue3:自定义指令主要是为了重用涉及普通元素的底层 DOM 访问的逻辑。 在 Vue.js 中使用自定义指令&#xf…

uni-app快速入门(十一)--常用JS API(上)

在前面学习了uni-app的布局、组件、路由等知识点以后&#xff0c;还要掌握uni-app的JS API ,也可以理解为基于uni-app的java script。本节介绍uni-app的request请求、文件上传、数据缓存、获取位置、获取系统信息、获取手机的网络状态、拨打电话API。 一、request请求 使用uni…

Ubuntu24.04解决向日葵安装libgconf-2-4依赖问题

最近在加装的ssd上加装了个Ubuntu&#xff0c;当然要装最新的长期支持稳定版啦&#xff0c;24.04.1&#xff0c;却发现常用的向日葵不好安装成功&#xff0c;即使是官方的说明&#xff0c;应该是用这个版本系统的人还不多。 找到了一个帅哥的解决方案&#xff0c;是可行的 但是…

工厂模式-工厂方法模式实现

具体的产品有具体的工厂类生产,这样当新增商品时,不需要修改原来的工厂类 主要有4个角色 抽象工厂 具体工厂 抽象产品 具体产品 1. 定义抽象产品,本文以生产手机为例 /*** @desc 抽象产品**/ public interface Phone { } 2. 定义具体产品-Apple /*** @desc 具体产品…

详解SpringCloud集成Camunda7.19实现工作流审批(一)

背景是公司里的一个企业管理系统项目里许多业务涉及了审批流&#xff0c;因此需要引进工作流引擎来开发一个通用的工作流服务&#xff0c;经过调研最终采用的是集成Camunda7.19版本引擎来实现文章目录 一、参考资源二、工作流简介三、工作流引擎四、Camunda安装1.流程图设计器2…

【Linux内核剖析】深入分析inet_init的处理机制

inet_init 是 Linux 内核中用于初始化 TCP/IP 协议栈的函数。它在内核启动时被调用&#xff0c;完成各种协议和数据结构的注册和初始化。 主要功能&#xff1a; 注册 TCP、UDP、ICMP 等协议。初始化 ARP、IP 和其他网络协议模块。设置 socket 操作和协议处理。 前后调用关系链…

使用 .NET 创建新的 WPF 应用

本教程介绍如何使用 Visual Studio 创建新的 Windows Presentation Foundation &#xff08;WPF&#xff09; 应用。 使用 Visual Studio&#xff0c;可以向窗口添加控件以设计应用的 UI&#xff0c;并处理这些控件中的输入事件以与用户交互。 在本教程结束时&#xff0c;你有一…

【机器学习chp3】判别式分类器:线性判别函数、线性分类器、广义线性分类器、分段线性分类器

前言&#xff1a; 本文遗留问题&#xff1a;&#xff08;1&#xff09;对最小平方误差分类器的理解不清晰.&#xff08;2&#xff09;分段线性判别函数的局部训练法理解不清晰。 推荐文章1&#xff0c;其中有关于感知机的分析 【王木头从感知机到神经网络】-CSDN博客 推荐文…

聚焦 NLP 和生成式 AI 的创新与未来 基础前置知识点

给学生们讲解的技术内容可以根据他们的背景、兴趣和教学目标来规划。以下是一些适合不同阶段和领域的技术主题建议&#xff0c;尤其是与大语言模型&#xff08;如 ChatGPT&#xff09;相关的内容&#xff1a; 1. 自然语言处理&#xff08;NLP&#xff09;基础 适合对 NLP 了解…

python3 Flask应用 使用 Flask-SQLAlchemy操作MySQL数据库

一、环境搭建 下载命令&#xff1a; pip install flask flask-sqlalchemy pymysql 二、创建项目结构 yourProjectFolder/ |—— app.py |—— config.py |—— models.py |__ mydb.py 三、基本使用 3.1 config.py 进行数据库连接配置 import osbasedir os.path.abspat…

深度学习:神经网络中线性层的使用

深度学习&#xff1a;神经网络中线性层的使用 在神经网络中&#xff0c;线性层&#xff08;也称为全连接层或密集层&#xff09;是基础组件之一&#xff0c;用于执行输入数据的线性变换。通过这种变换&#xff0c;线性层可以重新组合输入数据的特征&#xff0c;并将其映射到新…

Android中常见内存泄漏的场景和解决方案

本文讲解Android 开发中常见内存泄漏场景及其解决方案&#xff0c;内容包括代码示例、原因分析以及最佳实践建议。 1. 静态变量导致的内存泄漏 静态变量的生命周期与应用进程一致&#xff0c;如果静态变量持有了对 Activity 或其他大对象的引用&#xff0c;就可能导致内存泄漏…

docker-compose 安装 pgsql (postgres)

docker-compose-pg.yml 文件内容 version: 3 services:iepms-gateway:image: postgres:14.13container_name: postgresql-14.13restart: alwaysprivileged: trueenvironment:- POSTGRES_PASSWORD: test2024ports:- 15432:5432volumes:- /home/iepms/data/pgsql/data:/var/lib/…

Python 小高考篇(4)循环语句

目录 for 循环一个参数两个参数三个参数 while 循环break和continue语句break语句自测总结结尾 本文由Jzwalliser原创&#xff0c;发布在CSDN平台上&#xff0c;遵循CC 4.0 BY-SA协议。 因此&#xff0c;若需转载/引用本文&#xff0c;请注明作者并附原文链接&#xff0c;且禁止…