【Vue】组件通信(Props/Emit、EventBus、Provide/Inject)

个人主页:Guiat
归属专栏:Vue

文章目录
- 1. Props/Emit 父子组件通信
- 1.1 Props 向下传递数据
- 1.2 Emit 向上传递事件
- 2. EventBus 跨组件通信
- 2.1 创建事件总线
- 2.2 使用事件总线
- 2.3 EventBus 优缺点
- 3. Provide/Inject 深层组件通信
- 3.1 基本使用
- 3.2 响应式处理
- 3.3 Provide/Inject 优缺点
- 4. 各通信方式对比与选择
- 5. 最佳实践建议
正文
1. Props/Emit 父子组件通信
1.1 Props 向下传递数据
Props 是 Vue 中最基本的组件通信方式,用于父组件向子组件传递数据。
// 子组件定义
export default {name: 'ChildComponent',props: {// 基础类型检查message: String,// 多种类型propA: [String, Number],// 必填项requiredProp: {type: String,required: true},// 带默认值propWithDefault: {type: Number,default: 100},// 对象/数组默认值objectProp: {type: Object,default: () => ({ key: 'value' })},// 自定义验证customProp: {validator(value) {return ['success', 'warning', 'danger'].includes(value)}}}
}
1.2 Emit 向上传递事件
子组件通过触发事件向父组件传递信息。
// 子组件
<template><div><button @click="sendToParent">发送到父组件</button></div>
</template><script>
export default {emits: ['update', 'delete'], // 声明组件发出的事件methods: {sendToParent() {// 触发事件并传递数据this.$emit('update', { id: 1, name: '更新的数据' })}}
}
</script>
// 父组件
<template><child-component @update="handleUpdate"@delete="handleDelete"/>
</template><script>
export default {methods: {handleUpdate(data) {console.log('收到子组件数据:', data)},handleDelete(id) {console.log('删除ID:', id)}}
}
</script>
2. EventBus 跨组件通信
2.1 创建事件总线
EventBus 允许任意组件间通信,不受组件层级限制。
// Vue 2 创建事件总线
// eventBus.js
import Vue from 'vue'
export const EventBus = new Vue()// Vue 3 创建事件总线
// eventBus.js
import mitt from 'mitt'
export const EventBus = mitt()
2.2 使用事件总线
// 组件A - 发送事件
import { EventBus } from '@/eventBus'export default {methods: {sendMessage() {// Vue 2EventBus.$emit('custom-event', { message: '这是一条消息' })// Vue 3EventBus.emit('custom-event', { message: '这是一条消息' })}}
}
// 组件B - 接收事件
import { EventBus } from '@/eventBus'export default {created() {// Vue 2EventBus.$on('custom-event', this.handleEvent)// Vue 3EventBus.on('custom-event', this.handleEvent)},beforeDestroy() { // Vue 2EventBus.$off('custom-event', this.handleEvent)},beforeUnmount() { // Vue 3EventBus.off('custom-event', this.handleEvent)},methods: {handleEvent(data) {console.log('收到事件数据:', data)}}
}
2.3 EventBus 优缺点
优点:
- 使用简单,可实现任意组件间通信
- 不需要组件间有直接的引用关系
缺点:
- 可能导致事件混乱,难以追踪数据流向
- 组件耦合度增加,不利于维护
- 大型应用中建议使用Vuex/Pinia等状态管理方案
3. Provide/Inject 深层组件通信
3.1 基本使用
适用于深层嵌套组件间通信,祖先组件提供数据,后代组件注入使用。
// 祖先组件提供数据
export default {provide() {return {// 提供静态值theme: 'dark',// 提供响应式数据user: this.user,// 提供方法updateUser: this.updateUser}},data() {return {user: { name: '张三', role: 'admin' }}},methods: {updateUser(newUser) {this.user = newUser}}
}
// 后代组件注入数据
export default {inject: ['theme', 'user', 'updateUser'],// 或者使用别名和默认值inject: {appTheme: {from: 'theme',default: 'light'},currentUser: 'user'},methods: {changeUserRole() {this.updateUser({...this.currentUser, role: 'editor'})}}
}
3.2 响应式处理
Vue 3中使用provide/inject实现响应式通信:
// 祖先组件 (Vue 3)
import { provide, ref, readonly } from 'vue'export default {setup() {const count = ref(0)function increment() {count.value++}// 提供只读值防止子组件修改provide('count', readonly(count))provide('increment', increment)return { count, increment }}
}
// 后代组件 (Vue 3)
import { inject } from 'vue'export default {setup() {const count = inject('count')const increment = inject('increment')return { count, increment }}
}
3.3 Provide/Inject 优缺点
优点:
- 解决深层嵌套组件通信问题
- 避免了"prop drilling"(属性透传)
- Vue 3中与组合式API结合使用更加灵活
缺点:
- 增加了组件间的隐式依赖
- 重构时可能导致问题
- 数据来源不明确,可能影响代码可维护性
4. 各通信方式对比与选择
| 通信方式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| Props/Emit | 父子组件通信 | 简单直接,Vue官方推荐 | 层级深时需要多层传递 |
| EventBus | 任意组件间通信 | 使用简单,无需组件关系 | 事件难以追踪,大型应用不推荐 |
| Provide/Inject | 深层组件通信 | 避免属性透传 | 增加隐式依赖 |
| Vuex/Pinia | 复杂应用状态管理 | 集中管理状态,状态变化可追踪 | 小型应用可能过于复杂 |
| a t t r s / attrs/ attrs/listeners | 透传属性和事件 | 无需显式声明即可传递 | 仅适用于中间层组件传递 |
5. 最佳实践建议
- 就近原则:优先使用最简单的通信方式解决问题
- 明确数据流:保持单向数据流,便于追踪和调试
- 合理拆分组件:减少不必要的组件嵌套和通信
- 状态提升:将共享状态提升到最近的共同父组件
- 大型应用:考虑使用Vuex/Pinia进行状态管理
- 文档化:为组件间的通信方式编写清晰的文档
通过合理选择和组合这些通信方式,可以构建出数据流清晰、易于维护的Vue应用。
结语
感谢您的阅读!期待您的一键三连!欢迎指正!

相关文章:
【Vue】组件通信(Props/Emit、EventBus、Provide/Inject)
个人主页:Guiat 归属专栏:Vue 文章目录 1. Props/Emit 父子组件通信1.1 Props 向下传递数据1.2 Emit 向上传递事件 2. EventBus 跨组件通信2.1 创建事件总线2.2 使用事件总线2.3 EventBus 优缺点 3. Provide/Inject 深层组件通信3.1 基本使用3.2 响应式处…...
electron打包是没有正确生成electron.exe,x ENOENT: no such file or directory, rename:
情况一 arch配置错误,最好根据自己的电脑架构配置 win: {target: [{target: "nsis", arch: ["x64"],},],artifactName: "${productName}_${version}.${ext}",}, 情况二、 electron没有被正确下载,可以翻墙重新通过npm…...
立体匹配模型RAFT-Stereo的onnx导出与trt使用指南
这里写目录标题 如何将 RAFT-Stereo 模型导出为 ONNX 格式转化为静态的模型:转化为动态的模型:reference通过将 RAFT-Stereo 模型转换为 ONNX 格式,我们能够在不同的推理引擎和硬件平台上高效地部署和运行该模型,而无需依赖原始的 PyTorch 环境。这为在实际应用中使用 RAFT…...
C++数组栈与链表栈
数组栈 #include <iostream> using namespace std; class mystack{ private:int dat[1000];int curr0; public:void push(int);void pop();int top();bool empyt();int size(); }; void mystack::push(int b){if(curr<1000){dat[curr]b;curr;} } void mystack::pop()…...
QT实现串口透传的功能
在一些产品的开发的时候,需要将一个串口的数据发送给另外一个串口进行转发。 具体的代码如下: #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::Ma…...
动态规划入门:背包问题求具体方案(以0-1背包问题为例)
本质:有向图最短(长)路问题 字典序最小方案?--贪心思路?(本题未使用) 分析第一个物品: 写代码时tip:要考虑“边读边做”还是“先读后做” #include<iostream> #i…...
WEMOS LOLIN32 开发板引脚布局和技术规格
🔗 快速链接ESP32 Development Boards, Sensors, Tools, Projects and More https://megma.ma/wp-content/uploads/2021/08/Wemos-ESP32-Lolin32-Board-BOOK-ENGLISH.pdf WEMOS LOLIN32 Development Board Details, Pinout, Specs WEMOS LOLIN32 Development Board …...
mysql中的group by用法详解
MySQL中的GROUP BY是数据聚合分析的核心功能,主要用于将结果集按指定列分组,并结合聚合函数进行统计计算。以下从基本语法到高级用法进行详细解析: 一、基本语法与核心功能 SELECT 分组列, 聚合函数(计算列) FROM 表名 [WHERE 条件] GROUP B…...
java基础从入门到上手(九):Java - List、Set、Map
一、List集合 List 是一种用于存储有序元素的集合接口,它是 java.util 包中的一部分,并且继承自 Collection 接口。List 接口提供了多种方法,用于按索引操作元素,允许元素重复,并且保持插入顺序。常用的 List 实现类包…...
从malloc到free:动态内存管理全解析
1.为什么要有动态内存管理 我们已经掌握的内存开辟方法有: int main() {int val 20;//在栈空间上开辟四个字节char arr[20] { 0 };//在栈空间上开辟10个字节的连续空间return 0; }上述开辟的内存空间有两个特点: 1.空间开辟的时候大小已经固定 2.数组…...
AutoSAR从概念到实践系列之MCAL篇(二)——Mcu模块配置及代码详解(上)
欢迎大家学习我的《AutoSAR从概念到实践系列之MCAL篇》系列课程,我是分享人M哥,目前从事车载控制器的软件开发及测试工作。 学习过程中如有任何疑问,可底下评论! 如果觉得文章内容在工作学习中有帮助到你,麻烦点赞收藏评论+关注走一波!感谢各位的支持! 根据上一篇内容中…...
ubuntu22.04安装dukto
1.添加源 sudo add-apt-repository ppa:xuzhen666/dukto2.进行更新和安装 sudo apt update sudo apt install dukto3.报错 $ sudo apt install dukto 正在读取软件包列表... 完成 正在分析软件包的依赖关系树... 完成 正在读取状态信息... 完成 您也许需要…...
【数据库】事务
目录 1. 什么是事务? 2. 事务的ACID特性 3. 为什么使用事务? 4. 如何使用事务 4.1 查看支持事务的存储引擎 4.2 语法 4.3 保存点 4.4 自动/手动提交事务 5. 事物的隔离性和隔离级别 5.1 什么是隔离性 5.2 隔离级别 5.3 查看和设置隔离级别 1…...
使用Redis实现实时排行榜
为了实现一个实时排行榜系统,我们可以使用Redis的有序集合(ZSet),其底层通常是使用跳跃表实现的。有序集合允许我们按照分数(score)对成员(member)进行排序,因此非常适合…...
QML中的3D功能--入门开发
Qt Quick 提供了强大的 3D 功能支持,主要通过 Qt 3D 模块实现。以下是 QML 中开发 3D 应用的全面指南。 1. 基本配置 环境要求 Qt 5.10 或更高版本(推荐 Qt 6.x) 启用 Qt 3D 模块 支持 OpenGL 的硬件 项目配置 在 .pro 文件中添加: QT += 3dcore 3drender 3dinput 3dex…...
6. 字符串
1.反转字符串 2.替换数字 3.反转字符串中的单词 4.KMP算法 5.重复的子字符串(看具体证明) 太6了(真不是人做的)...
000.初识 dyld
dyld(Dynamic Link Editor) 是 Apple 操作系统的动态加载器/链接器。 在 iOS 或 iPadOS 启动一个 Mach‑O 可执行文件时,dyld 会: 解析可执行文件头,确认 CPU 架构、地址空间布局随机化(ASLR)参…...
Redis ④-通用命令
Redis 是一个 客户端-服务器 结构的程序,这与 MySQL 是类似的,这点需要牢记!!! Redis 固然好,但也不是任何场景都适合使用 Redis,一定要根据当前的业务需求来选择是否使用 Redis Redis 通用命令…...
卷积神经网络(CNN)与VGG16在图像识别中的实验设计与思路
卷积神经网络(CNN)与VGG16在图像识别中的实验设计与思路 以下从基础原理、VGG16架构解析、实验设计步骤三个层面展开说明,结合代码示例与关键参数设置,帮助理解其应用逻辑。 一、CNN与VGG16的核心差异 基础CNN结构 通常包含33~55个…...
玩机搞机基本常识-------小米OLED屏幕机型怎么设置为永不休眠_手机不息屏_保持亮屏功能 拒绝“烧屏” ?
前面在帮一位粉丝解决小米OLED机型在设置----锁屏下没有永不休眠的问题。在这里,大家要明白为什么有些小米机型有这个设置有的没有的原因。区分OLED 屏幕和 LCD屏幕的不同。从根本上拒绝烧屏问题。 OLED 屏幕的一些优缺点💝💝💝 …...
2021-11-14 C++三七二十一数
缘由c编程怎么写,紧急求解-编程语言-CSDN问答 void 三七二十一数() {//缘由https://ask.csdn.net/questions/7566632?spm1005.2025.3001.5141int n 0, a 0, b 0, p 1;std::cin >> n;while (n--){std::cin >> a >> b;while (a<b){if (a %…...
安全生产责任制考核方案与风险评估
安全生产责任制考核方案旨在通过有效落实国家安全生产法律法规,确保煤矿及相关单位的安全管理机制建立与运行,减少生产安全事故的发生。方案强调通过定期的量化考核和系统化评估,确保安全生产责任的有效落实。考核涉及集团公司各单位及相关人…...
Transformers是一种基于自注意力机制的神经网络模型
概述与发展历程 背景介绍 Transformers是一种基于自注意力机制的神经网络模型,最早由Google团队在2017年的论文《Attention Is All You Need》中提出。该模型旨在解决传统循环神经网络(RNNs)在处理长距离依赖关系时的低效性问题,…...
32-工艺品商城小程序
技术: 基于 B/S 架构 SpringBootMySQLvueelementuiuniapp 环境: Idea mysql maven jdk1.8 node 可修改为其他类型商城 用户端功能 1.系统首页展示轮播图及工艺品列表 2.分类模块:展示产品的分类类型 3.购物车:进行商品多选结算 或者批量管理操作 4.…...
深度解析微前端架构设计:从monorepo工程化设计到最佳实践
一、项目架构概览:微前端与传统架构的融合创新 在企业级前端工程中,微前端架构通过「分治思想」解决了单体应用臃肿、技术栈割裂、团队协作低效等问题。本项目采用 主应用(基座) 子应用集群 独立服务 的立体化架构,支…...
强制重装及验证onnxruntime-gpu是否正确工作
#工作记录 我们经常会遇到明明安装了onnxruntime-gpu或onnxruntime后,无法正常使用的情况。 一、强制重新安装 onnxruntime-gpu 及其依赖 # 强制重新安装 onnxruntime-gpu 及其依赖 pip install --force-reinstall --no-cache-dir onnxruntime-gpu1.18.0 --extra…...
设计模式 --- 外观模式
外观模式是一种结构型设计模式,为复杂子系统提供统一的高层接口,通过定义一个外观类来简化客户端与子系统的交互,降低系统耦合度。这种模式隐藏了子系统的复杂性,将客户端与子系统的实现细节隔离开来,…...
OverlayFS 简介与最简单 Demo
OverlayFS 是什么 OverlayFS 是一种 Linux 文件系统,允许将多个目录(称为“层”)叠加在一起,形成一个统一的视图。它广泛用于容器技术(如 Docker),用于实现镜像层和容器写时复制(Co…...
Python爬虫实战:获取B站查询数据
一、引言 1.1 研究背景 随着互联网的迅猛发展,视频分享平台积累了海量的数据资源。以 B 站为例,其丰富的视频内容和活跃的用户群体蕴含着巨大的价值。对 B 站搜索数据进行爬取和分析,有助于洞察用户兴趣、市场趋势以及内容创作方向,为市场调研、用户行为分析和内容推荐系…...
用python脚本怎么实现:把一个文件夹里面.png文件没有固定名称,复制到另外一个文件夹按顺序命名?
环境: python3.10 Win10 问题描述: 用python脚本怎么实现:怎么把一个文件夹里面.png文件没有固定名称,复制到另外一个文件夹按顺序命名? 解决方案: 1.新建一个脚本文件,内容如下࿱…...
