一文读懂 Vue 组件间通信机制(含 Vue2 / Vue3 区别)

作者:excel日期:2025/10/8

一、组件间通信的概念

在 Vue 中,组件(Component) 是最核心的概念之一。每个 .vue 文件都可以视为一个独立的组件。
通信(Communication) 是指一个组件如何将信息传递给另一个组件。

通俗地说:

组件间通信,就是不同组件之间如何共享数据、触发行为、进行信息交互的过程。

例如:当我们使用 UI 框架中的 table 组件时,需要向它传入 data 数据,这个“传值”的过程本质上就是一种组件通信。


二、组件间通信解决了什么问题?

在实际开发中,每个组件都有自己的作用域,数据默认是相互隔离的。但我们经常希望:

  • 父组件能把数据传给子组件;
  • 子组件能向父组件反馈事件或数据;
  • 两个兄弟组件能共享状态;
  • 甚至是跨层级(祖孙、非亲缘)组件之间的数据共享。

这正是组件通信的意义所在

让组件之间能够协作、共享数据,从而构成一个有机、完整的应用系统。


三、组件间通信的分类

按照组件关系,通信可分为以下几种:

  1. 父子组件通信
  2. 兄弟组件通信
  3. 祖孙组件通信
  4. 非关系组件通信

简单关系图如下:

1Parent
2 ├── Child A
3 └── Child B
4      └── GrandChild
5

四、Vue 中 8 种常见通信方案

下面是 Vue2 / Vue3 通用的 8 种通信方式,并在最后补充两者的区别。


1. props 传递数据(父 → 子)

适用场景: 父组件向子组件传值。

子组件定义:

1export default {
2  props: {
3    name: String,
4    age: {
5      type: Number,
6      default: 18,
7      required: true
8    }
9  }
10}
11

父组件使用:

1<Child name="Jack" :age="18" />
2

📘 Vue3 区别:
Vue3 支持在 <script setup> 中使用 defineProps

1const props = defineProps({
2  name: String,
3  age: Number
4})
5

2. $emit 触发自定义事件(子 → 父)

适用场景: 子组件向父组件传递数据或事件。

子组件:

1this.$emit('add', good)
2

父组件:

1<Child @add="cartAdd($event)" />
2

📘 Vue3 区别:
Vue3 使用 defineEmits

1const emit = defineEmits(['add'])
2emit('add', good)
3

3. ref 获取子组件实例(父 → 子)

适用场景: 父组件想直接访问子组件实例或方法。

父组件:

1<Child ref="foo" />
2
1this.$refs.foo.someMethod()
2

📘 Vue3 区别:
Vue3 的 ref 通过 setup 中的 ref() 引用,访问方式为 childRef.value


4. EventBus 事件总线(兄弟组件)

适用场景: 兄弟组件之间传值。

Bus.js:

1import Vue from 'vue'
2export const Bus = new Vue()
3

发送方:

1Bus.$emit('foo', data)
2

接收方:

1Bus.$on('foo', (data) => { console.log(data) })
2

📘 Vue3 区别:
Vue3 没有 $on/$off,可用第三方库(如 mitt)实现轻量事件总线:

1import mitt from 'mitt'
2export const bus = mitt()
3
4bus.emit('foo', data)
5bus.on('foo', handler)
6

5. parent/parent / parent/root(祖辈 → 后代)

适用场景: 通过组件实例树访问父组件或根组件方法。

1this.$parent.someMethod()
2this.$root.globalFn()
3

📘 Vue3 区别:
仍可用,但在 Composition API 下不推荐,应优先使用 provide/inject


6. attrs与attrs 与 attrs与listeners(祖先 → 子孙)

适用场景: 批量向下传递属性与事件。

1<!-- Parent.vue -->
2<Child2 msg="hello" @some-event="handleEvent" />
3
4<!-- Child2.vue -->
5<Grandson v-bind="$attrs" v-on="$listeners" />
6
7<!-- Grandson.vue -->
8<div @click="$emit('some-event', 'from grandson')">
9  {{ msg }}
10</div>
11

📘 Vue3 区别:
Vue3 将 $listeners 合并入 $attrs,事件监听器自动包含其中:

1<Grandson v-bind="$attrs" />
2

7. Provide / Inject(祖孙通信)

适用场景: 祖先组件向任意深度的后代组件传递数据。

祖先组件:

1provide() {
2  return {
3    foo: 'foo'
4  }
5}
6

后代组件:

1inject: ['foo']
2

📘 Vue3 区别:
Vue3 使用 Composition API:

1// 祖先
2import { provide } from 'vue'
3provide('foo', 'foo')
4
5// 后代
6import { inject } from 'vue'
7const foo = inject('foo')
8

8. Vuex(或 Pinia)(全局状态管理)

适用场景: 复杂组件关系、跨层级状态共享。

Vuex 核心概念:

  • state:存放共享状态;
  • getters:相当于计算属性;
  • mutations:同步修改 state;
  • actions:支持异步逻辑;
  • modules:模块化管理。

📘 Vue3 推荐:
Vue 官方推荐使用 Pinia,API 更简洁、类型友好。


五、通信方式选择建议

关系类型推荐通信方式说明
父 → 子props简单直接
子 → 父$emit常用于回调
父 ↔ 子ref调用方法或取值
兄弟组件EventBus / mitt中央事件总线
祖孙组件provide / inject优雅高效
非关系组件Vuex / Pinia全局状态共享
属性透传$attrs / $listeners批量下传属性
简单共享状态Composition API + reactive()Vue3 场景

六、小结

  • 父子通信: 使用 props$emit 最简洁,也可用 ref
  • 兄弟通信: 推荐 EventBusmitt
  • 祖孙通信:provide / inject 最优雅。
  • 全局通信: 使用 Vuex(Vue2)或 Pinia(Vue3)。
  • Vue3 提升点: Composition API 让通信更灵活,逻辑更集中。

总结一句话:

在 Vue 中,组件间通信的本质就是——让数据在不同组件间可控地流动


本文内容由人工智能生成,仅供学习与参考使用,请在实际应用中结合自身情况进行判断。


一文读懂 Vue 组件间通信机制(含 Vue2 / Vue3 区别)》 是转载文章,点击查看原文


相关推荐


【Node】Node.js 多进程与多线程:Cluster 与 Worker Threads 入门
你的人类朋友2025/10/6

前言 在 Node.js 开发中,处理 CPU 密集型任务和提升应用性能是常见需求。 今天我们来深入理解 Node.js 提供的两种并发处理方案:Cluster 模块和 Worker Threads 模块。 ☺️ 这边要求阅读本文的新手小伙伴要有一个印象:【Cluster】 与【进程】相关,【Worker Threads】 与【线程】相关 小贴士 📚: ✨Cluster 的中文意思是集群 ✨Worker Threads 的中文意思是工作线程 官方定义解析 Node.js 官方文档指出:


【Linux系统】快速入门一些常用的基础指令
落羽的落羽2025/10/5

各位大佬好,我是落羽!一个坚持不断学习进步的学生。 如果您觉得我的文章还不错,欢迎多多互三分享交流,一起学习进步! 也欢迎关注我的blog主页: 落羽的落羽 文章目录 pwd、whoami、clearmkdir、touch、treecdlsrmdir、rmmanechocat、tac、more、less、head、tailcp、mvfind、which、whereisaliasgrepzip、unzip、taruname 开始学习使用Linux,我们首先要掌握一些Linux


快速搭建redis环境并使用redis客户端进行连接测试
你的人类朋友2025/10/4

前言 最近工作要用到 redis,所以这边简要记录一下自己搭建 redis 环境的过程,后面忘记了回头看比较方便。 正文 一、环境安装 这边推荐个跨 windows 和 mac 的 redis 客户端,another Redis Desktop Manager windows 一般安装Another-Redis-Desktop-Manager-win-1.7.1-x64.exe mac 一般安装Another-Redis-Desktop-Manager-mac-1.7.1-arm64.dmg 具


Java 设计模式在 Spring 框架中的实践:工厂模式与单例模式
武昌库里写JAVA2025/10/2

# Java 设计模式在 Spring 框架中的实践:工厂模式与单例模式 概述 在软件开发中,设计模式是为了解决特定问题的最佳实践经验的总结。而工厂模式和单例模式是其中两个最为常用和重要的设计模式,在 Java 开发中得到了广泛应用。在 Spring 框架中,工厂模式和单例模式也有着非常重要的应用。本文将从实际的案例出发,介绍工厂模式和单例模式在 Spring 框架中的实践。 工厂模式在 Spring 框架中的实践 工厂模式简介 工厂模式是一种创


如何用 CSS 中写出超级美丽的阴影效果
非优秀程序员2025/10/2

「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战」。 在我看来,最好的网站和Web应用程序对它们具有切实的"真实"质量。实现这种质量涉及很多因素,但阴影是一个关键因素。 然而,当我环顾网络时,很明显,大多数阴影并不像它们所希望的那样丰富。网络上覆盖着模糊的灰色盒子,看起来并不像影子。 在本教程中,我们将学习如何将典型的箱形阴影转换为美丽、逼真的阴影: 为什么还要使用阴影? 我保证,我们很快就会谈到有趣的CSS技巧。但首先,我想退后一步,谈谈为什么阴影存在于CSS中,以


Xrdp 远程桌面配置【笔记】
AnsonNie2025/10/2

Xrdp 远程桌面配置 Xrdp 是一个开源的 远程桌面协议(RDP)服务器。 核心功能:它允许您使用来自其他计算机的图形化桌面连接到运行它的 Linux 服务器。工作原理:它在 Linux 系统上创建一个 RDP 服务端。您可以从任何兼容 RDP 的客户端(如 Windows 自带的“远程桌面连接”、macOS 的 Microsoft Remote Desktop、Linux 的 Remmina 等)进行连接。底层技术:通常,Xrdp 本身并不直接提供桌面环境,而是与现有的 X Windo


starrocks查询伪代码
syty202010/1/2025

尽可能下推到存储层,在扫描时利用索引 (前缀索引、Bloom Filter、位图索引、ZoneMap) 提前过滤掉大量无关数据块,减少 I/O 和 CPU 处理量。​,实现了极致的查询性能。它将数据处理任务分解成高效的、针对现代硬件优化的批处理操作流,最大限度地榨干了 CPU 和 I/O 的性能。​ 在列数据上执行紧凑的循环,最大化 CPU 缓存利用率。​ 只读查询需要的列,利用列存格式的压缩和编码优势。​ (数据流驱动,最小化等待) 两大核心技术,结合​。​ (所有算子处理 Batch) 和 ​。


Midscene.js为什么能通过大语言模型成功定位页面元素
测试者家园9/30/2025

Midscene.js 能通过大语言模型成功定位页面元素并生成 XPath 这类路径,核心在于其多模态模型对网页视觉和语义信息的深度理解,从而实现了所见即所操作的能力。它改变了传统自动化测试严重依赖脆弱定位器的状况,用更高层的意图描述替代了底层的实现细节,在提升脚本稳定性和降低使用门槛方面是一次重要的创新。


【机器学习】无监督学习 —— K-Means 聚类、DBSCAN 聚类
一杯水果茶!2025/10/9

K-Means 聚类标准 K-Means 算法K-Means 评估:肘部法则(Elbow Method)与轮廓系数(Silhouette Score)1. 肘部法则(Elbow Method)2. 轮廓系数(Silhouette Score) DBSCAN 聚类(Density-Based Spatial Clustering of Applications with Noise)DBSCAN 的关键参数DBSCAN 算法 K-Means 聚类 K‑Means 聚类 是一种


零基础学JavaScript:手把手带你搭建环境,写出第一个程序!
良山有风来2025/10/11

开头:你是不是也遇到过这些问题? 刚学JavaScript的时候,你是不是一脸懵? 打开教程,满屏的“Node.js”、“npm”、“VS Code”,完全不知道从哪下手? 照着网上的教程配置环境,结果各种报错,心态爆炸? 写了半天代码,连个“Hello World”都显示不出来? 别担心!这篇文章就是为你准备的。 我会用最直白的方式,带你一步步搭建JavaScript开发环境,并写出你的第一个程序。 看完这篇文章,你不仅能顺利运行第一个JavaScript程序,还能理解背后的原理,为后续学习打

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0