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

devtools/2025/1/31 4:11:35/

在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.ppmy.cn/devtools/154763.html

相关文章

【MySQL】初始MySQL、库与表的操作

目录 基本使用 使用案例 SQL分类 存储引擎 库的操作 字符集和校验规则 查看系统默认字符集和校验规则 查看数据库支持的字符集 查看数据库支持的字符集校验规则 指定编码常见数据库 校验规则对数据库的影响 操纵数据库 库的备份与恢复 表的操作 创建表 查看表 …

扣子平台音频功能:让声音也能“智能”起来。扣子免费系列教程(14)

在数字化时代&#xff0c;音频内容的重要性不言而喻。无论是在线课程、有声读物&#xff0c;还是各种多媒体应用&#xff0c;音频都是传递信息、增强体验的关键元素。扣子平台的音频功能&#xff0c;为开发者和内容创作者提供了一个强大而灵活的工具&#xff0c;让音频的使用和…

STM32 中断系统

目录 中断 定义&#xff1a; 中断处理的过程&#xff1a; 1.中断申请&#xff1a; 2.中断响应&#xff1a; 3.中断处理&#xff1a; 4.中断向量 : 5.中断返回&#xff1a; 中断优先级 1.抢占优先级 2.响应优先级 3.自然优先级 中断嵌套 中断执行流程 中断源 NV…

Python GUI 开发 | Qt Designer — 工具介绍

关注这个框架的其他相关笔记&#xff1a;Python GUI 开发 | PySide6 & PyQt6 学习手册-CSDN博客 Qt Designer 即 Qt 设计师&#xff0c;是一个强大、灵活的可视化 GUI 设计工具&#xff0c;可以帮助用户加快开发 PySide6 程序的速度。 Qt Designer 是专门用来制作 PySide6…

SpringBoot整合Swagger UI 用于提供接口可视化界面

目录 一、引入相关依赖 二、添加配置文件 三、测试 四、Swagger 相关注解 一、引入相关依赖 图像化依赖 Swagger UI 用于提供可视化界面&#xff1a; <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactI…

PCB Editor层叠文件(Gerber文件输出-01)

先看底层和表层,如下图 钢网表层和底层,如下图 丝印表层和底层,如下图 阻焊表层和底层,如下图 下面来添加钻孔层,先提取钻孔表 点击OK后钻孔表会挂在鼠标上

go安全项目汇总表

Go安全项目汇总表 开发者/团队GitHub/Gitee 地址主要项目项目描述Stars 数量yhy0https://github.com/yhy0/ChYingChYing目录扫描&#xff0c;Swagger测试&#xff0c;JWT&#xff0c;NucleiY漏洞扫描&#xff0c;BurpSuite&#xff0c;字典可配置&#xff0c;编码、解码-shado…

React应用深度优化与调试实战指南

一、渲染性能优化进阶 1.1 精细化渲染控制 typescript 复制 // components/HeavyComponent.tsx import React, { memo, useMemo } from react;interface Item {id: string;complexData: {// 复杂嵌套结构}; }const HeavyComponent memo(({ items }: { items: Item[] }) &g…