【vue组件通信】一文了解组件通信多种方式

前言

在 Vue 中,组件通信有多种方式,适用于不同场景(父子组件、兄弟组件、跨级组件等)。以下是完整的组件传值方法总结,仅供概览参考:


一、父子组件通信

1. Props(父 → 子)

父组件通过属性传递数据,此方式单向数据流,子组件的数据会随着父的更改而响应式的得到更新

<!-- 父组件 -->
<Child :title="parentData" />
// 子组件
export default {props: ['title']
}
2. 自定义事件(子 → 父)

子组件通过 $emit 绑定一个自定义事件并触发,当这个事件被执行的时候就会将参数传递给父组件,而父组件通过v-on监听并接收

<!-- 父组件 -->
<Child @custom-event="handleEvent" />
// 子组件
this.$emit('custom-event', data)
3. v-model / .sync(双向绑定)
  • Vue 2: 使用 .sync 修饰符

    <!-- 父组件 -->
    <Child :value.sync="data" />
    <!-- 子组件触发更新:this.$emit('update:value', newValue) -->
    
  • Vue 3: 默认支持多个 v-model

    <Child v-model:title="pageTitle" />
    <!-- 子组件触发:emit('update:title', newValue) -->
    
4. $refs(访问子组件实例)

父组件直接调用子组件方法/数据

<Child ref="childRef" />
this.$refs.childRef.childMethod();

二、兄弟组件通信

1. 事件总线(Event Bus)

其原理就是:事件订阅发布,eventBus 又称为事件总线; 缺点:多人协同开发场景维护困难

  • 创建全局事件中心:

    // eventBus.js
    import { mitt } from 'mitt'; // Vue 3 推荐使用 mitt 库
    export const bus = mitt();
    
  • 组件 A 发送事件:

    bus.emit('event-name', data);
    
  • 组件 B 接收事件:

    bus.on('event-name', (data) => { ... });
    
2. 通过共同父组件中转

子组件 A → 父组件(事件)→ 子组件 B(Props)


三、跨层级通信

1. Provide / Inject
  • 祖先组件提供数据:

    export default {provide() {return { theme: this.themeData };}
    }
    
  • 后代组件注入数据:

    export default {inject: ['theme']
    }
    
  • Vue 3 响应式方案

    import { provide, ref } from 'vue';
    const data = ref('value');
    provide('key', data);
    
2. $attrs / $listeners(透传)
  • $attrs包含了父作用域中不被认为 (且不预期为) props 的特性绑定 (class 和 style 除外),并且可以通过 v-bind=“$attrs” 传入内部组件。当一个组件没有声明任何 props 时,它包含所有父作用域的绑定 (class 和 style 除外)。
  • $listeners包含了父作用域中的 (不含 .native 修饰符) v-on 事件监听器。它可以通过 v-on=“$listeners” 传入内部组件。它是一个对象,里面包含了作用在这个组件上的所有事件监听器,相当于子组件继承了父组件的事件。
  • 父组件传递未声明的 Props/事件:

    <GrandChild v-bind="$attrs" v-on="$listeners" />
    
  • Vue 3 合并 $attrs$listeners,直接使用 v-bind="$attrs"


四、全局状态管理

1. Vuex(Vue 2 官方方案)
// 组件中获取/修改状态
this.$store.state.data;
this.$store.commit('mutation', value);
2. Pinia(Vue 3 官方推荐)
// store/user.js
export const useUserStore = defineStore('user', {state: () => ({ name: 'John' }),actions: { updateName(name) { this.name = name; } }
});// 组件中使用
import { useUserStore } from '@/stores/user';
const store = useUserStore();
store.name; // 获取
store.updateName('Alice'); // 修改

五、其他方式

1. 插槽作用域(父 ↔ 子)
  • 子组件通过插槽暴露数据:

    <!-- 子组件 -->
    <slot :item="itemData"></slot>
    
  • 父组件使用:

    <Child v-slot="slotProps">{{ slotProps.item }}
    </Child>
    
2. 浏览器存储

localStorage / sessionStorage + window.addEventListener('storage') 监听变化。

3. $children | $parent (vue3已弃用)
  • 通过 $parent 访问到的是上一级父组件的实例,可以使用 $root 来访问根组件的实例
  • 在组件中使用$children拿到的是所有的子组件的实例,它是一个数组,并且是无序的
  • 在根组件 #app 上拿 $parent 得到的是 new Vue()的实例,在这实例上再拿 $parent 得到的是undefined,而在最底层的子组件拿 $children 是个空数组
  • $children 的值是数组,而 $parent是个对象删除线格式

选择建议

场景推荐方式
父子组件简单传值Props / 自定义事件
父子组件双向绑定v-model (Vue 3) / .sync (Vue 2)
跨层级/深嵌套组件Provide / Inject
兄弟/任意组件通信事件总线 / Vuex/Pinia
全局状态管理(复杂应用)Pinia (Vue 3) / Vuex (Vue 2)
透传属性/事件$attrs / v-bind="$attrs"

注意

  • Vue 3 移除了 $children$listeners(合并到 $attrs
  • 事件总线在 Vue 3 需用第三方库(如 mitt
  • 优先使用单向数据流(Props + 事件),避免直接修改父组件数据

总结

实际使用中应该根据项目规模选择合适的方案,小型项目可用 Props/事件总线,中大型项目推荐 Pinia/Vuex。

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

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

相关文章

项目一系列-第3章 若依框架入门

第3章 若依框架入门 3.1 若依框架概述 为什么要基于若依框架开发&#xff1f; 快速开发&#xff1a;能快速搭建一个应用框架&#xff0c;减少工作量。可定制化&#xff1a;提供丰富插件和拓展点&#xff0c;满足不同项目的特定需求。简化开发流程&#xff1a;框架提供常用的功能…

WSL安装MuJoco报错——FatalError: gladLoadGL error

文章目录WSL中配置MuJoCo报错 FatalError: gladLoadGL error 的终极解决方案&#x1f50d; 问题原因分析✅ 解决方案&#xff1a;切换至 EGL 渲染后端第一步&#xff1a;安装系统级依赖库第二步&#xff1a;使用 Conda 安装兼容的图形库第三步&#xff1a;设置环境变量以启用 E…

2025产品经理接单经验分享与平台汇总

产品和开发永远是一家&#xff0c;如此说来产品和开发接单的经验和平台其实大差不差&#xff0c;今天刚好看到后台有人咨询产品经理接单的问题&#xff0c;索性直接写一篇文章好了。 目录 一、产品经理接单的三个关键建议 1、能力产品化&#xff0c;比履历更重要 2、合同、…

BGP协议笔记

一、BGP协议&#xff08;边界网关协议&#xff09; 是一种用于自治系统间的动态路由协议&#xff0c;是一种外部网关(EGP)协议。负责在不同自治系统(AS)之间交换路由信息&#xff0c;目的是实现大规模网络的可扩展性、策略控制和稳定性。 自治系统AS&#xff1a;一组被进行统…

Ⅹ—6.计算机二级综合题27---30套

第27套 【填空题】 给定程序中,函数fun的功能是:计算形参x所指数组中N个数的平均值(规定所有数均为正数),将所指数组中小于平均值的数据依次移至数组的前部,大于等于平均值的数据依次移至x所指数组的后部,平均值作为函数值返回,在主函数中输出平均值和移动后的数据。 …

GDB 调试全方位指南:从入门到精通

在程序开发中&#xff0c;调试是定位和解决问题的核心环节。GDB (GNU Debugger) 作为一款功能强大的命令行调试器&#xff0c;是Linux环境下C/C开发者的必备利器。本文将系统讲解GDB的使用方法&#xff0c;涵盖基础操作到高级技巧&#xff0c;助你高效排错。一、基础准备&#…

Python:从元类到多态的实战指南

Python 作为一门灵活且强大的编程语言&#xff0c;其高级特性为开发者提供了极大的创造力和代码优化空间。本文将围绕元类、序列化、抽象类与多态等核心高级特性展开&#xff0c;结合丰富的实战代码示例&#xff0c;从原理到应用进行全方位解析&#xff0c;帮助你更深入地理解 …

LLM实战(三)——昇腾300i duo推理卡(NPU)大模型推理记录

npu推理环境配置:https://ascend.github.io/docs/sources/ascend/quick_install.html llama-factory适配的NPU说明:https://llamafactory.readthedocs.io/zh-cn/latest/advanced/npu_inference.html 一些CANN命令: 与cuda的对应关系 # 查看NPU信息 npu-smi info = nvidia-s…

【原创】锐捷AM5532宿舍AP接口状态智能巡检实战:Python脚本+Excel报表+QQ自动推送,某高校落地案例

⚡ 项目已稳定运行 180+ 天,累计巡检 14 万接口,邮件告警 0 漏报 📊 CSDN 质量分 5.0 标准:代码 + 图表 + 可落地 + 可复制, 欢迎收藏、点赞、评论三连! 一、背景 某 高校学生宿舍采用锐捷 RG-AM5532 系列交换机下挂无线 AP,高峰期 2.4 万终端并发。 网络中心痛点: …

用户、组和目录的磁盘配额

一、XFS_quota限制用户和组的容量&#xff08;block&#xff09;与文件数量&#xff08;inode&#xff09;&#xff1b;限制block就限制了用户可以使用的磁盘容量&#xff0c;限制inode就可以限制用户新建的文件数量限制某一目录的最大磁盘配额&#xff08;directory project&a…

[GESP202506 五级] 最大公因数

题目描述 对于两个正整数 a,ba,ba,b&#xff0c;他们的最大公因数记为 gcd⁡(a,b)\gcd(a,b)gcd(a,b)。对于 k>3k > 3k>3 个正整数 c1,c2,…,ckc_1,c_2,\dots,c_kc1​,c2​,…,ck​&#xff0c;他们的最大公因数为&#xff1a; gcd⁡(c1,c2,…,ck)gcd⁡(gcd⁡(c1,c2,……

实现一个进程池(精讲)

目录 写进程池前的理论扫盲 进程池的实现 写进程池前的理论扫盲 父进程创建子进程&#xff0c;父子俩都看见同一片资源&#xff0c;这片资源被俩进程利用&#xff0c;用来通信&#xff0c;这片资源就是管道&#xff0c;如图所示&#xff0c;能很好地诠释管道。 那么什么是进程…

【tips】css模仿矢量图透明背景

就像棋盘格background-image: linear-gradient(45deg, #f0f0f0 25%, transparent 25%), linear-gradient(-45deg, #f0f0f0 25%, transparent 25%), linear-gradient(45deg, transparent 75%, #f0f0f0 75%), linear-gradient(-45deg, transparent 75%, #f0f0f0 75%);background-…

visual studio 历史版本安装

visual studio 历史版本安装 链接&#xff1a;Visual Studio 版本路线图 说明&#xff1a;该页面提供历史版本的发布说明及下载链接&#xff08;需滚动至页面底部查找相关版本&#xff09;。例如&#xff0c;2022 版本可能包含 17.0 至 17.14 等子版本&#xff0c;用户可根据需…

微软推出“愤怒计划“:利用AI工具实现恶意软件自主分类

微软周二宣布推出一款能够自主分析并分类软件的人工智能&#xff08;AI&#xff09;代理系统&#xff0c;旨在提升恶意软件检测能力。这款基于大语言模型&#xff08;LLM&#xff09;的自主恶意软件分类系统目前仍处于原型阶段&#xff0c;被微软内部代号命名为"愤怒计划&…

SOLIDWORKS Electrical:实现真正意义上的机电协同设计

随着市场的发展&#xff0c;企业面临两个方面的挑战&#xff1a;从业务和市场方面来看&#xff0c;为了在竞争中取得更大优势&#xff0c;需要更高质量的产品&#xff0c;较低的成本并缩短产品上市周期&#xff1b;从设计和技术方面来看&#xff0c;产品的集成度越来越高&#…

MySql_忘记了root密码怎么办

《MySql_忘记了root密码怎么办》在忘记root密码的时候&#xff0c;可以按以下步骤处理&#xff08;以windows为例&#xff09;。_1) 关闭正在运行的MySQL服务。_2) 打开DOS窗口&#xff0c;转到mysql\bin目录。_3) 输入mysqld –skip-grant-tables 回车。–skip-grant-tables 的…

wstool和catkin_tools工具介绍

好的&#xff0c;我们来详细介绍一下 python3-wstool 和 python3-catkin-tools 这两个在 ROS (Robot Operating System) 开发中非常重要的工具&#xff0c;以及它们之间的关系。 首先&#xff0c;python3- 这个前缀表示这些是针对 Python 3 的软件包版本&#xff0c;这在现代 R…

吴恩达 深度学习笔记

最近在看吴恩达深度学习系列课程&#xff0c;简单做一个基本框架笔记。 如感兴趣或了解更多内容&#xff0c;推荐看原课程 以前也做过一些与机器学习和深度学习有关的笔记&#xff0c;过分重复的就一笔带过了。 01 第一门课 神经网络和深度学习 1.1 第一周&#xff1a;深度学习…