Vue 3 30天精进之旅:Day 08 - 组件通信

在Vue 3的开发过程中,组件之间的通信是一个至关重要的概念。理解如何在父子组件、兄弟组件以及通过全局事件总线进行通信,将帮助我们构建更为灵活和可维护的应用。在今天的学习中,我们将探讨以下几个方面:

  1. 父子组件之间的通信
  2. 兄弟组件之间的通信
  3. 非父子组件之间的通信
  4. 总结与实践

1. 父子组件之间的通信

在Vue中,父子组件之间的通信主要通过 props 和 自定义事件 实现。

使用 Props 传递数据

父组件可以通过 props 将数据传递给子组件。我们来看一个简单的示例:

vue

<!-- ParentComponent.vue -->
<template><div><ChildComponent :message="parentMessage" /></div>
</template><script>
import ChildComponent from './ChildComponent.vue';export default {components: {ChildComponent,},data() {return {parentMessage: 'Hello from Parent!',};},
};
</script>

vue

<!-- ChildComponent.vue -->
<template><div><p>{{ message }}</p></div>
</template><script>
export default {props: {message: {type: String,required: true,},},
};
</script>

在这个例子中,ParentComponent 将 parentMessage 作为 message prop 传递给 ChildComponent,子组件通过 props 接收数据并展示。

使用 Custom Events (自定义事件)

子组件可以通过 $emit 方法向父组件发送消息或事件。例如:

vue

<!-- ChildComponent.vue -->
<template><div><button @click="sendMessage">Send Message to Parent</button></div>
</template><script>
export default {methods: {sendMessage() {this.$emit('messageFromChild', 'Hello from Child!');},},
};
</script>

vue

<!-- ParentComponent.vue -->
<template><div><ChildComponent @messageFromChild="receiveMessage" /><p>{{ receivedMessage }}</p></div>
</template><script>
import ChildComponent from './ChildComponent.vue';export default {components: {ChildComponent,},data() {return {receivedMessage: '',};},methods: {receiveMessage(msg) {this.receivedMessage = msg;},},
};
</script>

在这个例子中,ChildComponent 通过 sendMessage 方法触发自定义事件 messageFromChild,而 ParentComponent 则在接收到事件后更新了 receivedMessage

2. 兄弟组件之间的通信

兄弟组件之间的通信可以通过父组件作为中介来实现。父组件可以将数据作为 props 传递给两个兄弟组件,或者通过事件监听来传递消息。

例如,假设我们有两个兄弟组件 SiblingA 和 SiblingB,它们需要通信。我们可以在父组件中处理这个逻辑:

vue

<!-- ParentComponent.vue -->
<template><div><SiblingA @sendMessage="updateMessage" /><SiblingB :message="sharedMessage" /></div>
</template><script>
import SiblingA from './SiblingA.vue';
import SiblingB from './SiblingB.vue';export default {components: {SiblingA,SiblingB,},data() {return {sharedMessage: '',};},methods: {updateMessage(msg) {this.sharedMessage = msg;},},
};
</script>

SiblingA.vue 触发事件

vue

<!-- SiblingA.vue -->
<template><div><button @click="sendMessage">Send Message to Sibling B</button></div>
</template><script>
export default {methods: {sendMessage() {this.$emit('sendMessage', 'Hi from Sibling A');},},
};
</script>

SiblingB.vue 接收对方的消息

vue

<!-- SiblingB.vue -->
<template><div><p>{{ message }}</p></div>
</template><script>
export default {props: {message: String,},
};
</script>

3. 非父子组件之间的通信

对于不直接关联的组件,我们通常可以使用 中央事件总线 或 状态管理工具(如 Vuex 或 Pinia)来进行通信。

使用中央事件总线

创建一个事件总线,允许不同组件通过它进行通信。

javascript

// eventBus.js
import { reactive } from 'vue';const eventBus = reactive({});export default eventBus;

然后在组件中使用它发送和接收事件:

javascript

// AnyComponent.vue
import eventBus from './eventBus';export default {mounted() {this.sendMessage();eventBus.on('my-event', this.handleEvent);},methods: {sendMessage() {eventBus.dispatch('my-event', 'Hello from AnyComponent');},handleEvent(msg) {console.log(msg);},},
};

4. 总结与实践

在今天的学习中,我们深入理解了组件之间的通信方式,包括父子组件的props自定义事件、兄弟组件的父组件中介方法,以及通过事件总线实现的非父子组件通信。掌握这些通信方式将帮助我们更好地解决实际开发中的问题。

练习

  1. 尝试改进之前的 Todo 应用,增加新功能,使用组件通信来处理不同组件之间的数据流。
  2. 设计一个简单的消息系统,让多个组件可以互相发送消息,体验事件总线的工作原理。

在下一天的学习中,我们将关注 组合式API 的使用,继续深入Vue的世界。让我们保持学习热情,明天见!

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

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

相关文章

【Hadoop】Hadoop 概述

Hadoop 概述 Hadoop 是什么Hadoop 发展历史Hadoop 三大发行版本Hadoop 优势&#xff08;4 高&#xff09;Hadoop 组成&#xff08;面试重点&#xff09;HDFS 架构概述YARN 架构概述MapReduce 架构概述HDFS、YARN、MapReduce 三者关系 大数据技术生态体系 Hadoop 是什么 Hadoop…

网络爬虫学习:应用selenium获取Edge浏览器版本号,自动下载对应版本msedgedriver,确保Edge浏览器顺利打开。

一、前言 我从24年11月份开始学习网络爬虫应用开发&#xff0c;经过2个来月的努力&#xff0c;于1月下旬完成了开发一款网络爬虫软件的学习目标。这里对本次学习及应用开发进行一下回顾总结。 前几天我已经发了一篇日志&#xff08;网络爬虫学习&#xff1a;应用selenium从搜…

关于使用微服务的注意要点总结

一、防止过度设计 微服务的拆分一定要结合团队人员规模来考虑&#xff0c;笔者就曾遇到过一个公司的项目&#xff0c;是从外部采购回来的&#xff0c;微服务划分为十几个应用&#xff0c;我们在此项目基础上进行自行维护和扩展。由于公司业务规模不大&#xff0c;而且二次开发的…

CSS Fonts(字体)

CSS Fonts(字体) 在网页设计中,字体是传达信息情感和风格的关键元素。CSS(层叠样式表)提供了丰富的字体样式和属性,使得网页设计者能够根据需求选择合适的字体,从而提升用户体验。本文将详细介绍CSS字体相关的知识,包括字体的选择、加载、样式设置等。 字体的选择 选…

week08_文本匹配任务

1、文本匹配任务概述 狭义&#xff1a; 给定一组文本&#xff0c;判断其是否语义相似 今天天气不错 match 今儿个天不错呀 √ 今天天气不错 match 你的代码有bug 以分值形式给出相似度 今天天气不错 match 今儿个天不错呀 0.9 今天天气不错 match…

Deepseek技术浅析(一)

DeepSeek 是北京深度求索人工智能基础技术研究有限公司推出的人工智能技术品牌&#xff0c;专注于大语言模型&#xff08;LLM&#xff09;的研发与应用。其技术涵盖了从模型架构、训练方法到应用部署的多个层面&#xff0c;展现出强大的创新能力和应用潜力。以下将详细介绍 Dee…

火出圈的DeepSeeK R1详解

各位宝子们,新年好! 模型特性 DeepSeek-R1是一款创新的AI推理模型,具有多项独特特性: 高性能推理能力 :在数学、代码和自然语言推理等任务上表现出色,性能对标OpenAI o1正式版。 强化学习驱动的训练 :采用大规模强化学习技术,仅需极少量标注数据,显著提升推理能力。…

Kafka 副本机制(包含AR、ISR、OSR、HW 和 LEO 介绍)

文章目录 Kafka 副本机制&#xff08;包含AR、ISR、OSR、HW 和 LEO 介绍&#xff09;1. 副本的基本概念2. 副本同步和一致性2.1 AR&#xff08;Assigned Replicas&#xff09;2.2 ISR&#xff08;In-Sync Replicas&#xff09;2.3 OSR&#xff08;Out-of-Sync Replicas&#xf…

【JavaEE】_MVC架构与三层架构

目录 1. MVC架构 2. 三层架构 3. MVC架构与三层架构的对比 3.1 MVC与三层架构的对比 3.2 MVC与三层架构的共性 1. MVC架构 在前文已介绍关于SpringMAC的设计模式&#xff0c;详见下文&#xff1a; 【JavaEE】_Spring Web MVC简介-CSDN博客文章浏览阅读967次&#xff0c;点…

CAPL与外部接口

CAPL与外部接口 目录 CAPL与外部接口1. 引言2. CAPL与C/C++交互2.1 CAPL与C/C++交互简介2.2 CAPL与C/C++交互实现3. CAPL与Python交互3.1 CAPL与Python交互简介3.2 CAPL与Python交互实现4. CAPL与MATLAB交互4.1 CAPL与MATLAB交互简介4.2 CAPL与MATLAB交互实现5. 案例说明5.1 案…

【Matlab高端绘图SCI绘图模板】第006期 对比绘柱状图 (只需替换数据)

1. 简介 柱状图作为科研论文中常用的实验结果对比图&#xff0c;本文采用了3组实验对比的效果展示图&#xff0c;代码已调试好&#xff0c;只需替换数据即可生成相关柱状图&#xff0c;为科研加分。通过获得Nature配色的柱状图&#xff0c;让你的论文看起来档次更高&#xff0…

随机森林例子

完整代码&#xff1a; # 导入必要的库 from sklearn.datasets import load_iris from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score import numpy as np# 加载鸢尾花数…

【QT】 控件 -- 显示类

&#x1f525; 目录 [TOC]( &#x1f525; 目录) 1. 前言 2. 显示类控件2.1 Label 1、显示不同文本2、显示图片3、文本对齐、自动换行、缩进、边距4、设置伙伴 3.2 LCD Number 3.3 ProgressBar 3.4 Calendar Widget 3. 共勉 &#x1f525; 1. 前言 之前我在上一篇文章【QT】…

SpringBoot中@Valid与@Validated使用场景详解

SpringBoot中Valid与Validated使用场景详解 在实际开发中&#xff0c;参数校验是保证接口安全性和数据完整性的重要手段。Spring Boot提供了Valid和Validated两个核心注解来实现参数校验&#xff0c;但许多开发者对它们的区别和使用场景存在疑惑。本文将深入解析二者的差异&am…

基于PyQt设计的智能停车管理系统

文章目录 一、前言1.1 项目介绍【1】项目开发背景【2】设计实现的功能【3】设计意义【4】国内外研究现状【6】摘要1.2 设计思路1.3 系统功能总结1.4 开发工具的选择【1】VSCODE【2】python【3】ptqt【4】HyperLPR31.5 参考文献二、安装Python环境1.1 环境介绍**1.2 Python版本介…

前端-Rollup

Rollup 是一个用于 JavaScript 的模块打包工具&#xff0c;它将小的代码片段编译成更大、更复杂的代码&#xff0c;例如库或应用程序。它使用 JavaScript 的 ES6 版本中包含的新标准化代码模块格式&#xff0c;而不是以前的 CommonJS 和 AMD 等特殊解决方案。ES 模块允许你自由…

数仓ETL测试

提取&#xff0c;转换和加载有助于组织使数据在不同的数据系统中可访问&#xff0c;有意义且可用。ETL工具是用于提取&#xff0c;转换和加载数据的软件。在当今数据驱动的世界中&#xff0c;无论大小如何&#xff0c;都会从各种组织&#xff0c;机器和小工具中生成大量数据。 …

策略模式 - 策略模式的使用

引言 在软件开发中&#xff0c;设计模式是解决常见问题的经典解决方案。策略模式&#xff08;Strategy Pattern&#xff09;是行为型设计模式之一&#xff0c;它允许在运行时选择算法的行为。通过将算法封装在独立的类中&#xff0c;策略模式使得算法可以独立于使用它的客户端…

网络直播时代的营销新策略:基于受众分析与开源AI智能名片2+1链动模式S2B2C商城小程序源码的探索

摘要&#xff1a;随着互联网技术的飞速发展&#xff0c;网络直播作为一种新兴的、极具影响力的媒体形式&#xff0c;正逐渐改变着人们的娱乐方式、消费习惯乃至社交模式。据中国互联网络信息中心数据显示&#xff0c;网络直播用户规模已达到3.25亿&#xff0c;占网民总数的45.8…

STM32调试手段:重定向printf串口

引言 C语言中经常使用printf来输出调试信息&#xff0c;打印到屏幕。由于在单片机中没有屏幕&#xff0c;但是我们可以重定向printf&#xff0c;把数据打印到串口&#xff0c;从而在电脑端接收调试信息。这是除了debug外&#xff0c;另外一个非常有效的调试手段。 一、什么是pr…