【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父子组件间数据通信

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

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

相关文章

[蓝桥杯] 挖矿(CC++双语版)

题目链接 P10904 [蓝桥杯 2024 省 C] 挖矿 - 洛谷 题目理解 我们可以将这道题中矿洞的位置理解成为一个坐标轴&#xff0c;以题目样例绘出坐标轴&#xff1a; 样例&#xff1a; 输入的5为矿洞数量&#xff0c;4为可走的步数。第二行输入是5个矿洞的坐标。输出结果为在要求步数…

2025年Python的主要应用场景

李升伟 编译 Python在2025年仍是最受欢迎和强大的编程语言之一。其简洁易读的语法以及庞大的库生态系统&#xff0c;使其成为各行业开发者的首选。无论是构建复杂的数据管道&#xff0c;还是自动化重复性任务&#xff0c;Python都能提供广泛的应用场景&#xff0c;以实现快速、…

fastapi完全离线环境(无外网)的访问Swagger所做特殊处理

在互联网环境中&#xff0c;只要 启动FastAPI 服务运行在本地机器上&#xff0c;访问 http://localhost:8000/docs&#xff08;Swagger UI&#xff09;就可以访问到Swagger界面&#xff0c;但是在完全离线环境&#xff08;无外网&#xff09;下如何访问Swagger页面呢&#xff1…

Ubuntu 20.04 出现问号图标且无法联网 修复

在 Ubuntu 中遇到网络连接问题&#xff08;如出现问号图标且无法联网&#xff09;&#xff0c;可以通过以下命令尝试重启网络服务&#xff1a; 1. 推荐先修改DNS 编辑 -> 虚拟机网络编辑器-> VMnet8 ->NAT 设置 -> DNS 设置 -> 设置DNS 服务器 DNS填什么 取决…

哈希表(开散列)的实现

目录 引入 开散列的底层实现 哈希表的定义 哈希表的扩容 哈希表的插入 哈希表查找 哈希表的删除 引入 接上一篇&#xff0c;我们使用了闭散列的方法解决了哈希冲突&#xff0c;此篇文章将会使用开散列的方式解决哈希冲突&#xff0c;后面对unordered_set和unordered_map的…

机器学习(八):K-Means聚类原理与实战

声明&#xff1a;未经允许禁止转载与抄袭。 前言 k k k均值&#xff08; k k k-means&#xff09;聚类算法是一种经典的无监督聚类算法&#xff0c;本文将深入解析其理论原理&#xff0c;并在真是数据集上进行算法实践&#xff0c;话不多说&#xff0c;请看下文。 算法原理 …

判断矩阵A和矩阵B是否相似?

【例题1】 &#xff08;1&#xff09;方法1 &#xff08;2&#xff09;方法2 &#xff08;3&#xff09;方法3 好题\(^o^)/~ 【注意】当二次多项式有重根时&#xff0c;即判别式为零&#xff0c;此时二次多项式是完全平方。

【10】搭建k8s集群系列(二进制部署)之安装Dashboard和CoreDNS

一、部署Dashboard 1.1、创建kubernetes-dashboard.yaml文件 完整的yaml配置文件信息如下&#xff1a; # Copyright 2017 The Kubernetes Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in …

大数据技术与Scala

集合高级函数 过滤 通过条件筛选集合元素&#xff0c;返回新集合。 映射 对每个元素应用函数&#xff0c;生成新集集合 扁平化 将嵌套集合展平为单层集合。 扁平化映射 先映射后展平&#xff0c;常用于拆分字符串。 分组 按规则将元素分组为Map结构。 归约 …

数据驱动可视化实战:图表狐精准生成图表的完整数据范式

一、数据输入黄金法则 图表狐 - AI图表生成工具,在线数据可视化要求数据描述必须包含三个核心要素&#xff1a; [主体对象] [量化指标] [维度划分] 错误示例 ❌&#xff1a; "展示各部门销售额对比" 正确示例 ✅&#xff1a; "2023年Q1-Q4各部门销售额&a…

苍穹外卖(1)-部分环境配置(git、数据库)

首先配置git 创建好本地仓库之后 把项目弄到远程仓库里去 先进行提交 &#xff0c;后进行推送 &#xff0c;然后gitee创建一个仓库 把这个url复制好 推送后会出来一个 点击推送&#xff0c;会让你输入gitee账号密码&#xff0c;输入自己的账号密码&#xff0c;就可以连接远程仓…

Ubunut18.04 离线安装MySQL 5.7.35

一、环境准备 1.1 官方下载MySQL5.7.35 完整包 1.2 上传包 & 解压 上传包名称是&#xff1a;mysql-server_5.7.35-1ubuntu18.04_amd64.deb-bundle.tar # 切换到上传目录 cd /home/MySQL # 解压&#xff1a; tar -xvf mysql-server_5.7.35-1ubuntu18.04_amd64.deb-bundle…

Linux(CentOS10) gcc编译

本例子摘自《鸟哥的linux私房菜-基础学习第四版》 21.3 用make进行宏编译 书中的代码在本机器(版本见下&#xff09;编译出错&#xff0c;改正代码后发布此文章&#xff1a; #kernel version: rootlocalhost:~/testmake# uname -a Linux localhost 6.12.0-65.el10.x86_64 #1…

MCP+Blender创建电力塔

MCP&#xff08;Model Context Protocol&#xff09;与Blender的结合是当前AI与3D建模领域的热门技术&#xff0c;它通过协议化的方式让Claude等AI模型直接控制Blender&#xff0c;实现自动化3D建模。 1. 功能与原理 • 核心能力&#xff1a;用户通过自然语言指令&#xff08;…

Qt与C++数据类型转换

本文深入探讨Qt与C中相似但不同的数据类型处理技巧。 一、QString与std::string的相互转换 1. QString → std::string 方法1&#xff1a;使用toStdString()&#xff08;推荐&#xff09; QString qstr "你好&#xff0c;Qt世界"; std::string str qstr.toStdS…

机器学习+EEG熵进行双相情感障碍诊断的综合评估

摘要 双相情感障碍(BD)是一种常见的精神疾病&#xff0c;特点是躁狂或轻躁狂与抑郁交替发作&#xff0c;其严重程度各异&#xff0c;导致准确及时的诊断具有一定的挑战性。EEG的非线性特征被认为是精神障碍的生物标志物&#xff0c;能够反映大脑的非线性动态。尽管已有研究证明…

企业应用集成全析:架构、实践与展望

企业应用集成全析&#xff1a;架构、实践与展望 一、企业应用集成的基本概念1.1 定义1.2 目标 二、企业应用集成的层次架构2.1 数据集成2.2 应用系统集成2.3 业务流程集成​ 三、企业应用集成的关键技术3.1 中间件技术3.2 Web 服务技术​3.3 企业服务总线&#xff08;ESB&#…

【STL】list介绍(附与vector的比较)

文章目录 1.关于list2.使用2.1 list的构造2.2 list 迭代器的使用2.3 list 容量操作2.3.1 size()2.3.2 empty()2.3.3 resize() 2.4 list 元素访问2.4.1 front()2.4.2 back() 2.5 list 修改操作2.5.1 push_front()2.5.2 pop_front()2.5.3 push_back()2.5.4 pop_back()2.5.5 inser…

【Django】教程-12-柱状图

【Django】教程-1-安装创建项目目录结构介绍 【Django】教程-2-前端-目录结构介绍 【Django】教程-3-数据库相关介绍 【Django】教程-4-一个增删改查的Demo 【Django】教程-5-ModelForm增删改查规则校验【正则钩子函数】 【Django】教程-6-搜索框-条件查询前后端 【Django】教程…

SQL:DDL(数据定义语言)和DML(数据操作语言)

目录 什么是SQL&#xff1f; 1. DDL&#xff08;Data Definition Language&#xff0c;数据定义语言&#xff09; 2. DML&#xff08;Data Manipulation Language&#xff0c;数据操作语言&#xff09; DDL和DML的区别 什么是SQL&#xff1f; SQL&#xff08;Structured …