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

【Vue3知识】组件间通信的方式

组件间通信的方式

    • 概述
      • **1. 父子组件通信**
        • **父组件向子组件传递数据(Props)**
        • **子组件向父组件发送事件(自定义事件)**
      • **2. 兄弟组件通信**
        • **通过父组件中转**
        • **使用全局状态管理(如 Pinia 或 Vuex)**
      • **3. 跨层级组件通信**
        • **使用 Provide/Inject**
        • **使用全局事件总线(不推荐)**
      • **4. 使用 Vue Router 的参数**
      • **总结**
    • 关联知识

概述

在 Vue 3 中,组件间通信是一个常见且重要的需求。Vue 3 提供了多种方式来实现组件间的通信,根据组件的关系(父子组件、兄弟组件、跨层级组件等)和具体需求,可以选择不同的通信方式。以下是一些常用的组件间通信方法:

1. 父子组件通信

父组件向子组件传递数据(Props)
  • 使用 props:父组件通过 props 向子组件传递数据。

  • 示例

    <!-- ParentComponent.vue -->
    <template><ChildComponent :message="parentMessage" />
    </template><script>
    import ChildComponent from './ChildComponent.vue';export default {components: { ChildComponent },data() {return {parentMessage: 'Hello from Parent',};},
    };
    </script>
    
    <!-- ChildComponent.vue -->
    <template><div>{{ message }}</div>
    </template><script>
    export default {props: {message: {type: String,required: true,},},
    };
    </script>
    
子组件向父组件发送事件(自定义事件)
  • 使用 $emit:子组件通过 $emit 触发事件,父组件监听该事件并处理。

  • 示例

    <!-- ParentComponent.vue -->
    <template><ChildComponent @update="handleUpdate" />
    </template><script>
    import ChildComponent from './ChildComponent.vue';export default {components: { ChildComponent },methods: {handleUpdate(newMessage) {console.log('Received from child:', newMessage);},},
    };
    </script>
    
    <!-- ChildComponent.vue -->
    <template><button @click="sendMessage">Send Message</button>
    </template><script>
    export default {methods: {sendMessage() {this.$emit('update', 'Hello from Child');},},
    };
    </script>
    

2. 兄弟组件通信

兄弟组件之间没有直接的通信机制,通常通过共同的父组件或状态管理工具实现。

通过父组件中转
  • 父组件作为中介:兄弟组件通过父组件传递数据或事件。

  • 示例

    <!-- ParentComponent.vue -->
    <template><SiblingOne @send-to-sibling="handleSiblingOneMessage" /><SiblingTwo :message="siblingTwoMessage" />
    </template><script>
    import SiblingOne from './SiblingOne.vue';
    import SiblingTwo from './SiblingTwo.vue';export default {components: { SiblingOne, SiblingTwo },data() {return {siblingTwoMessage: '',};},methods: {handleSiblingOneMessage(message) {this.siblingTwoMessage = message;},},
    };
    </script>
    
    <!-- SiblingOne.vue -->
    <template><button @click="sendMessage">Send to Sibling Two</button>
    </template><script>
    export default {methods: {sendMessage() {this.$emit('send-to-sibling', 'Hello from Sibling One');},},
    };
    </script>
    
    <!-- SiblingTwo.vue -->
    <template><div>{{ message }}</div>
    </template><script>
    export default {props: {message: {type: String,default: '',},},
    };
    </script>
    
使用全局状态管理(如 Pinia 或 Vuex)
  • Pinia:Vue 3 推荐的状态管理库,用于管理全局状态。

  • 示例

    # 安装 Pinia
    npm install pinia
    
    // store.js
    import { defineStore } from 'pinia';export const useMainStore = defineStore('main', {state: () => ({sharedMessage: '',}),actions: {setMessage(message) {this.sharedMessage = message;},},
    });
    
    <!-- SiblingOne.vue -->
    <template><button @click="sendMessage">Send to Sibling Two</button>
    </template><script>
    import { useMainStore } from './store';export default {setup() {const store = useMainStore();const sendMessage = () => {store.setMessage('Hello from Sibling One');};return { sendMessage };},
    };
    </script>
    
    <!-- SiblingTwo.vue -->
    <template><div>{{ sharedMessage }}</div>
    </template><script>
    import { computed } from 'vue';
    import { useMainStore } from './store';export default {setup() {const store = useMainStore();const sharedMessage = computed(() => store.sharedMessage);return { sharedMessage };},
    };
    </script>
    

3. 跨层级组件通信

使用 Provide/Inject
  • provideinject:Vue 3 提供的 API,用于在组件树中跨层级传递数据。

  • 示例

    <!-- GrandParentComponent.vue -->
    <template><ParentComponent />
    </template><script>
    import { provide } from 'vue';
    import ParentComponent from './ParentComponent.vue';export default {components: { ParentComponent },setup() {provide('sharedData', 'Hello from GrandParent');},
    };
    </script>
    
    <!-- ParentComponent.vue -->
    <template><ChildComponent />
    </template><script>
    import ChildComponent from './ChildComponent.vue';export default {components: { ChildComponent },
    };
    </script>
    
    <!-- ChildComponent.vue -->
    <template><div>{{ injectedData }}</div>
    </template><script>
    import { inject } from 'vue';export default {setup() {const injectedData = inject('sharedData');return { injectedData };},
    };
    </script>
    
使用全局事件总线(不推荐)
  • 事件总线:通过一个空的 Vue 实例作为事件总线,在组件间发送和接收事件。
  • 缺点:不推荐在 Vue 3 中使用,因为会导致组件间耦合度增加,难以维护。

4. 使用 Vue Router 的参数

  • 路由参数:通过路由参数在组件间传递数据。

  • 示例

    // router/index.js
    import { createRouter, createWebHistory } from 'vue-router';
    import ComponentA from './ComponentA.vue';
    import ComponentB from './ComponentB.vue';const routes = [{ path: '/component-a', component: ComponentA },{ path: '/component-b/:message', component: ComponentB },
    ];const router = createRouter({history: createWebHistory(),routes,
    });export default router;
    
    <!-- ComponentA.vue -->
    <template><button @click="navigateToB">Go to Component B</button>
    </template><script>
    import { useRouter } from 'vue-router';export default {setup() {const router = useRouter();const navigateToB = () => {router.push({ path: '/component-b/Hello from Component A' });};return { navigateToB };},
    };
    </script>
    
    <!-- ComponentB.vue -->
    <template><div>{{ $route.params.message }}</div>
    </template>
    

总结

  • 父子组件:使用 props$emit
  • 兄弟组件:通过父组件中转或使用状态管理工具。
  • 跨层级组件:使用 provide/inject
  • 全局状态:使用 Pinia 或 Vuex。
  • 路由参数:通过 Vue Router 传递参数。

选择合适的通信方式可以提高代码的可维护性和可扩展性。在 Vue 3 中,推荐优先使用 props$emitprovide/inject,并在需要全局状态管理时使用 Pinia。

关联知识

【Vue3知识】Vue3父子组件间数据通信

相关文章:

【Vue3知识】组件间通信的方式

组件间通信的方式 概述**1. 父子组件通信****父组件向子组件传递数据&#xff08;Props&#xff09;****子组件向父组件发送事件&#xff08;自定义事件&#xff09;** **2. 兄弟组件通信****通过父组件中转****使用全局状态管理&#xff08;如 Pinia 或 Vuex&#xff09;** **…...

HOOPS Visualize:跨平台、高性能的三维图形渲染技术解析

在当今数字化时代&#xff0c;三维可视化技术已成为众多行业的核心竞争力。HOOPS Visualize作为一款功能强大的三维图形渲染引擎&#xff0c;凭借其卓越的渲染能力、跨平台支持、丰富的交互功能、高度定制化以及快速部署等特性&#xff0c;为开发人员提供了构建高质量、高性能3…...

git 的常用指令

以下是 Git 命令分类大全&#xff0c;覆盖日常开发、团队协作和高级操作场景&#xff0c;按功能分类整理&#xff1a; 一、配置与初始化 命令说明git config --global user.name "Your Name"设置全局用户名git config --global user.email "emailexample.com&q…...

python学智能算法(九)|决策树深入理解

【1】引言 前序学习进程中&#xff0c;初步理解了决策树的各个组成部分&#xff0c;此时将对决策树做整体解读&#xff0c;以期实现深入理解。 各个部分的解读文章链接为&#xff1a; python学智能算法&#xff08;八&#xff09;|决策树-CSDN博客 【2】代码 【2.1】完整代…...

蓝桥杯 C/C++ 组历届真题合集速刷(一)

一、1.单词分析 - 蓝桥云课 &#xff08;模拟、枚举&#xff09;算法代码&#xff1a; #include <bits/stdc.h> using namespace std;int main() {string s;cin>>s;unordered_map<char,int> mp;for(auto ch:s){mp[ch];}char result_charz;int max_count0;fo…...

多类型医疗自助终端智能化升级路径(代码版.上)

大型医疗自助终端的智能化升级是医疗信息化发展的重要方向,其思维链一体化路径需要围绕技术架构、数据流协同、算法优化和用户体验展开: 一、技术架构层:分布式边缘计算与云端协同 以下针对技术架构层的分布式边缘计算与云端协同模块,提供具体编程实现方案: 一、边缘节点…...

区间 DP 详解

文章目录 区间 DP分割型合并型环形合并 区间 DP 区间 DP&#xff0c;就是在对一段区间进行了若干次操作后的最小代价&#xff0c;一般是合并和拆分类型。 分割型 分割型&#xff0c;指把一个区间内的几项分开拆成一份一份的&#xff0c;再全部合起来就是当前答案&#xff0c…...

如何在多线程中安全地使用 PyAudio

1. 背景介绍 在多线程环境下使用 PyAudio 可能会导致段错误&#xff08;Segmentation Fault&#xff09;或其他不可预期的行为。这是因为 PyAudio 在多线程环境下可能会出现资源冲突或线程安全问题。 PyAudio 是一个用于音频输入输出的 Python 库&#xff0c;它依赖于 PortAu…...

QAM 信号的距离以及能量归一化

QAM星座图平均功率能量_星座图功率计算-CSDN博客 正交幅度调制(QAM) - Vinson88 - 博客园 不同阶QAM调制星座图中&#xff0c;符号能量的归一化计算原理_qpsk的星座图归一化-CSDN博客 https://zhuanlan.zhihu.com/p/690157236...

Reactive编程框架与工具

文章目录 6.2 后端 Reactive 框架6.2.1 Spring WebFlux核心架构核心组件实际应用高级特性性能优化适用场景与限制 6.2.2 Akka&#xff08;Actor模型&#xff09;Actor模型基础基本用法高级特性响应式特性实现性能优化实际应用场景优势与挑战 6.2.3 Vert.x&#xff08;事件驱动&…...

五子棋游戏开发:静态资源的重要性与设计思路

以下是以CSDN博客的形式整理的关于五子棋游戏静态资源需求的文章&#xff0c;基于我们之前的讨论&#xff0c;内容结构清晰&#xff0c;适合开发者阅读和参考。我尽量保持技术性、实用性&#xff0c;同时加入一些吸引读者的亮点。 五子棋游戏开发&#xff1a;静态资源的重要性与…...

Python爬虫第7节-requests库的高级用法

目录 前言 一、文件上传 二、Cookies 三、会话维持 四、SSL证书验证 五、代理设置 六、超时设置 七、身份认证 八、Prepared Request 前言 上一节&#xff0c;我们认识了requests库的基本用法&#xff0c;像发起GET、POST请求&#xff0c;以及了解Response对象是什么。…...

Maven的安装配置-项目管理工具

各位看官&#xff0c;大家早安午安晚安呀~~~ 如果您觉得这篇文章对您有帮助的话 欢迎您一键三连&#xff0c;小编尽全力做到更好 欢迎您分享给更多人哦 今天我们来学习&#xff1a;Maven的安装配置-项目管理工具 目录 1.什么是Maven&#xff1f;Maven用来干什么的&#xff1f…...

智能 SQL 优化工具 PawSQL 月度更新 | 2025年3月

&#x1f4cc; 更新速览 本月更新包含 21项功能增强 和 9项问题修复&#xff0c;重点提升SQL解析精度与优化建议覆盖率。 一、SQL解析能力扩展 ✨ 新增SQL语法解析支持 SELECT...INTO TABLE 语法解析&#xff08;3/26&#xff09; ALTER INDEX RENAME/VISIBLE 语句解析&#…...

Ubuntu虚拟机编译安装部分OpenCV模块方法实现——保姆级教程

Ubuntu虚拟机的安装过程可以查看另一篇文章&#xff1a;VMware安装Ubuntu虚拟机实现COpenCV代码在虚拟机下运行教程-CSDN博客 目前我们已经下载好了OpenCV&#xff0c;这里以OpenCV4.5.2为例。 在内存要求尽可能小的情况下&#xff0c;可以尝试只编译安装代码中使用到的OpenC…...

find指令中使用正则表达式

linux查找命令能结合正则表达式吗 find命令要使用正则表达式需要结合-regex参数 另&#xff0c;-type参数可以指定查找类型(f为文件&#xff0c;d为文件夹) rootlocalhost:~/regular_expression# ls -alh 总计 8.0K drwxr-xr-x. 5 root root 66 4月 8日 16:26 . dr-xr-…...

Java Web从入门到精通:全面探索与实战(二)

Java Web从入门到精通&#xff1a;全面探索与实战&#xff08;一&#xff09;-CSDN博客 目录 四、Java Web 开发中的数据库操作&#xff1a;以 MySQL 为例 4.1 MySQL 数据库基础操作 4.2 JDBC 技术深度解析 4.3 数据库连接池的应用​ 五、Java Web 中的会话技术&#xff…...

基于大模型的阵发性室上性心动过速风险预测与治疗方案研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与目标 1.3 研究方法与数据来源 二、阵发性室上性心动过速概述 2.1 定义与分类 2.2 发病机制与流行病学 2.3 临床表现与诊断方法 三、大模型在阵发性室上性心动过速预测中的应用 3.1 大模型技术原理与特点 3.2 模型构…...

秒杀业务的实现过程

一.后台创建秒杀的活动场次信息&#xff0c;并关联到要秒杀的商品或服务&#xff1b; 二.通过定时任务&#xff0c;将秒杀的活动信息和商品服务信息存储到redis; 三.在商品展示页的显眼位置加载秒杀活动信息&#xff1b; 四.用户参与秒杀&#xff0c;创建订单&#xff0c;将…...

spring mvc @ResponseBody 注解转换为 JSON 的原理与实现详解

ResponseBody 注解转换为 JSON 的原理与实现详解 1. 核心作用 ResponseBody 是 Spring MVC 的一个注解&#xff0c;用于将方法返回的对象直接序列化为 HTTP 响应体&#xff08;如 JSON 或 XML&#xff09;&#xff0c;而不是通过视图解析器渲染为视图&#xff08;如 HTML&…...

TDengine.C/C++ 连接器

简介 C/C 开发人员可以使用 TDengine 的客户端驱动&#xff0c;即 C/C 连接器&#xff08;以下都用 TDengine 客户端驱动表示&#xff09;&#xff0c;开发自己的应用来连接 TDengine 集群完成数据存储、查询以及其他功能。TDengine 客户端驱动的 API 类似于 MySQL 的 C API。…...

[docker] 简单操作场景

Docker的简单操作场景 1 安装 暂时没空写&#xff5e; 2 登陆 一共4步&#xff1a; ~$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d765d4c1eb5f ubuntu:24.04 "/bin/bash" …...

skynet.rawcall使用详解及应用场景

目录 核心特性函数原型使用场景场景 1&#xff1a;高性能二进制传输&#xff08;如文件转发&#xff09;场景 2&#xff1a;自定义序列化协议&#xff08;如 Protocol Buffers&#xff09;场景 3&#xff1a;跨服务共享内存&#xff08;避免拷贝&#xff09; 配套接收方实现与 …...

使用SpringSecurity下,发生重定向异常

使用SpringSecurity下&#xff0c;发生空转异常 环境信息&#xff1a; Spring Boot 3.4.4 &#xff0c; jdk 17 &#xff0c; springSecurity 6.4.4 问题背景&#xff1a; 没有自定义controller &#xff0c;改写了login 页面&#xff0c;并且进行了成功后的跳转处理&#xf…...

gbase8s之逻辑导出导入脚本(完美版本)

该脚本dbexport.sh用于快速导出库和导入库&#xff08;使用多并发unload&#xff0c;和多并发dbload的方式&#xff09; #!/bin/sh #脚本功能&#xff1a;将数据导出成文本&#xff0c;迁移至其他实例 #最后更新时间&#xff1a;2023-12-19 #使用方法&#xff1a; #1.执行该脚…...

Elasticsearch | ES索引模板、索引和索引别名的创建与管理

关注&#xff1a;CodingTechWork 引言 在使用 Elasticsearch (ES) 和 Kibana 构建数据存储和分析系统时&#xff0c;索引模板、索引和索引别名的管理是关键步骤。本文将详细介绍如何通过 RESTful API 和 Kibana Dev Tools 创建索引模板、索引以及索引别名&#xff0c;并提供具…...

【Easylive】视频删除方法详解:重点分析异步线程池使用

【Easylive】项目常见问题解答&#xff08;自用&持续更新中…&#xff09; 汇总版 方法整体功能 这个deleteVideo方法是一个综合性的视频删除操作&#xff0c;主要完成以下功能&#xff1a; 权限验证&#xff1a;检查视频是否存在及用户是否有权限删除核心数据删除&…...

力扣hot100_回溯(2)_python版本

一、39. 组合总和&#xff08;中等&#xff09; 代码&#xff1a; class Solution:def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:ans []path []def dfs(i: int, left: int) -> None:if left 0:# 找到一个合法组合ans.append(pa…...

SGLang实战:从KV缓存复用到底层优化,解锁大模型高效推理的全栈方案

在当今快速发展的人工智能领域&#xff0c;大型语言模型(LLM)的应用已从简单对话扩展到需要复杂逻辑控制、多轮交互和结构化输出的高级任务。面对这一趋势&#xff0c;如何高效地微调并部署这些大模型成为开发者面临的核心挑战。本文将深入探讨SGLang——这一专为大模型设计的高…...

LPDDR4内存颗粒命名规则全解析:三星、镁光、海力士、南亚、长鑫等厂商型号解码与选型指南

由于之前DDR的系列选型文章有很好的反馈&#xff0c;所以补充LPDDR4低功耗内存的选型和命名规则&#xff0c;总结了目前市面上常用的内存&#xff0c;供硬件工程师及数码爱好者参考。 在智能手机、平板电脑和低功耗设备中&#xff0c;LPDDR4 SDRAM凭借其高带宽、低功耗特性成为…...