Vue7种组件之间通信方式

在 Vue.js 中,组件之间的通信方式非常丰富,下面将详细介绍几种常见的组件通信方式,并附上代码示例,包括 $attrs$listenersprovide/inject$parent/$children 和 ref

目录

1. 父子组件通信

1. Props 传值

2. $emit 传值

2. 子组件获取父组件的数据和方法

1. $parent

3. 使用 refs 访问子组件

4. 兄弟组件通信

a. 使用事件总线

5. provide/inject 进行跨级通信

6. attrs 和listeners

1. $attrs

2. $listeners

7. 兄弟组件通过共同父组件传递数据


1. 父子组件通信

1. Props 传值

父组件通过 Props 向子组件传递数据。

示例代码:

父组件 Parent.vue

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

子组件 Child.vue

<template><div>{{ message }}</div>
</template><script>
export default {props: {message: String}
};
</script>
2. $emit 传值

子组件通过 $emit 向父组件发送事件,父组件通过监听事件来处理数据。

示例代码:

子组件 Child.vue

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

父组件 Parent.vue

<template><div><Child @messageFromChild="handleMessage" /></div>
</template><script>
import Child from './Child.vue';export default {components: { Child },methods: {handleMessage(msg) {console.log(msg);}}
};
</script>

2. 子组件获取父组件的数据和方法

1. $parent

子组件可以通过 $parent 访问父组件的实例。

示例代码:

父组件 Parent.vue

<template><div><Child /></div>
</template><script>
import Child from './Child.vue';export default {components: { Child },data() {return {parentMessage: 'Hello from Parent!'};}
};
</script>

子组件 Child.vue

<template><div>{{ $parent.parentMessage }}</div>
</template><script>
export default {};
</script>

3. 使用 refs 访问子组件

父组件可以使用 ref 获取子组件的实例,从而调用其方法或访问其数据。

示例代码:

父组件 Parent.vue

<template><div><Child ref="childComponent" /><button @click="callChildMethod">Call Child Method</button></div>
</template><script>
import Child from './Child.vue';export default {components: { Child },methods: {callChildMethod() {this.$refs.childComponent.childMethod();}}
};
</script>

子组件 Child.vue

<template><div>Child Component</div>
</template><script>
export default {methods: {childMethod() {console.log('Child method called!');}}
};
</script>

4. 兄弟组件通信

a. 使用事件总线

通过创建一个全局事件总线实现无关组件之间的通信。

示例代码:

创建 EventBus.js

import Vue from 'vue';
export const EventBus = new Vue();

组件 A:

<template><button @click="sendData">Send Data</button>
</template><script>
import { EventBus } from './EventBus';export default {methods: {sendData() {EventBus.$emit('dataSent', 'Hello from Component A!');}}
};
</script>

组件 B:

<template><div>Data from Component A: {{ receivedData }}</div>
</template><script>
import { EventBus } from './EventBus';export default {data() {return {receivedData: ''};},created() {EventBus.$on('dataSent', (data) => {this.receivedData = data;});},beforeDestroy() {EventBus.$off('dataSent'); // 清除事件监听}
};
</script>

5. provide/inject 进行跨级通信

provide 和 inject 是 Vue.js 中用于实现跨级组件通信的一种方式。通过 provide,祖先组件可以向其所有后代组件提供数据,而通过 inject,后代组件可以接收这些数据。这种方式特别适用于需要在多个层级的组件之间共享数据的情况。

a.provide

provide 是一个函数,返回一个对象,该对象包含祖先组件希望提供给后代组件的数据。

b.inject

inject 是一个数组或对象,用于声明后代组件需要接收的数据。如果是一个数组,数组中的每个元素是祖先组件提供的键名;如果是一个对象,对象的键名是本地变量名,值是祖先组件提供的键名。

示例 1:基本用法

祖先组件 Grandparent.vue

<template><div><Parent /></div>
</template><script>
import Parent from './Parent.vue';export default {components: { Parent },provide() {return {message: 'Hello from Ancestor!'};}
};
</script>

父组件 Parent.vue

<template><div><Child /></div>
</template><script>
import Child from './Child.vue';export default {components: { Child }
};
</script>

子组件 Child.vue

<template><div>{{ message }}</div>
</template><script>
export default {inject: ['message']
};
</script>

在这个示例中,Ancestor.vue 通过 provide 提供了一个 messageChild.vue 通过 inject 接收了这个 message,并将其显示在模板中。

示例 2:使用对象形式的 inject

祖先组件 Ancestor.vue

<template><div><Parent /></div>
</template><script>
import Parent from './Parent.vue';export default {components: { Parent },provide() {return {providedMessage: 'Hello from Ancestor!'};}
};
</script>

子组件 Child.vue

<template><div>{{ injectedMessage }}</div>
</template><script>
export default {inject: {injectedMessage: 'providedMessage'}
};
</script>

在这个示例中,Ancestor.vue 通过 provide 提供了一个 providedMessageChild.vue 通过 inject 接收了这个 providedMessage,并将其赋值给本地变量 injectedMessage

注意事项

  1. 响应性provide 和 inject 绑定并不是响应式的。如果祖先组件提供的值发生变化,后代组件不会自动更新。如果需要响应式数据,可以使用 Vue.observable 或者 Vuex。

  2. 依赖注入provide 和 inject 主要用于开发高阶插件/组件库,不推荐用于普通应用程序代码。

6. attrs 和listeners

 在 Vue.js 中,$attrs 和 $listeners 是用于处理组件属性(attrs)和事件(listeners)的特殊对象,尤其在构建可重用的自定义组件时非常有用。以下是它们的详细介绍与示例代码。

1. $attrs

$attrs 是一个包含父作用域中传递给子组件的所有属性的对象(除了 class 和 style)。这使得子组件能够接收并使用由父组件传递的属性,而无需事先声明这些属性。

示例代码:

父组件 Parent.vue

<template><div><CustomInput placeholder="Enter your name" /></div>
</template><script>
import CustomInput from './CustomInput.vue';export default {components: { CustomInput }
};
</script>

子组件 CustomInput.vue

<template><input v-bind="$attrs" />
</template><script>
export default {inheritAttrs: false // 允许使用 $attrs
};
</script>

在这个示例中,父组件向 CustomInput 传递了一个 placeholder 属性。子组件通过 v-bind="$attrs" 绑定了所有未声明的属性。

2. $listeners

$listeners 是一个对象,包含了所有父组件传递给子组件的事件监听器,子组件可以通过 $listeners 修改这些事件的行为。

示例代码:

父组件 Parent.vue

<template><div><CustomButton @click="handleClick">Click Me</CustomButton></div>
</template><script>
import CustomButton from './CustomButton.vue';export default {components: { CustomButton },methods: {handleClick() {alert('Button clicked!');}}
};
</script>

子组件 CustomButton.vue

<template><button v-on="$listeners">{{ label }}</button>
</template><script>
export default {props: {label: {type: String,default: 'Default Button'}}
};
</script>

在这个示例中,父组件向 CustomButton 传递了一个点击事件监听器。子组件通过 v-on="$listeners" 将所有未声明的事件监听器附加到按钮上。

注意事项

  • inheritAttrs:当子组件使用 $attrs 时,通常需要将 inheritAttrs 设置为 false,以避免 Vue 自动将非 Prop 参数绑定到子组件的根元素上(例如:$attrs 会被默认绑定到根元素)。

  • 监听器的使用:在使用 $listeners 时,应确保在自定义组件中将这些事件转发到根元素或合适的元素上。

7. 兄弟组件通过共同父组件传递数据

通过共同的父组件,可以实现兄弟组件之间的通信。

示例代码:

父组件 Parent.vue

<template><div><SiblingA @sendData="receiveData" /><SiblingB :data="receivedData" /></div>
</template><script>
import SiblingA from './SiblingA.vue';
import SiblingB from './SiblingB.vue';export default {components: { SiblingA, SiblingB },data() {return {receivedData: ''};},methods: {receiveData(data) {this.receivedData = data;}}
};
</script>

兄弟组件 A SiblingA.vue

<template><button @click="sendData">Send Data to Sibling B</button>
</template><script>
export default {methods: {sendData() {this.$emit('sendData', 'Data from Sibling A');}}
};
</script>

兄弟组件 B SiblingB.vue

<template><div>Data from Sibling A: {{ data }}</div>
</template><script>
export default {props: {data: String}
};
</script>

总结

以上是 Vue.js 中各种组件通信方式的详细介绍与示例。在实际开发中,根据不同的需求选择合适的通信方式可以大大提高代码的可维护性和可读性。希望这些示例能够帮助你更好地理解 Vue 组件之间的通信。

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

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

相关文章

云原生-docker安装与基础操作

一、云原生 Docker 介绍 Docker 在云原生中的优势 二、docker的安装 三、docker的基础命令 1. docker pull&#xff08;拉取镜像&#xff09; 2. docker images&#xff08;查看本地镜像&#xff09; 3. docker run&#xff08;创建并启动容器&#xff09; 4. docker ps…

Spark 核心概念与宽窄依赖的详细解析

Spark 的介绍与搭建&#xff1a;从理论到实践_spark环境搭建-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交&#xff1a;本地与集群模式全解析-CSDN博客 Spark on YARN&#xff1a;Spark集群模式…

【css】html里面的图片宽度设为百分比,高度要与宽度一样

场景&#xff1a;展示图片列表的时候&#xff0c;原始图片宽高不一致。 外层div的宽度自适应&#xff0c;图片宽度不能固定数值&#xff0c;只能设置百分比。图片高度也不能设置固定数值。 如何让图片的高度与图片的宽度一样呢&#xff1f; html代码 &#xff1a; <div cl…

c#使用COM接口设置excel单元格宽高匹配图片,如何计算?

c#使用COM接口设置excel单元格宽高如何换算 在实际工作中&#xff0c;经常需要在excel中插入图片。并设置单元格与图片对齐。但是excel单元格的宽度和高度使用不同的单位。单元格的宽度以字符宽度为单位&#xff0c;而高度以点为单位。如果按照实际值来设置&#xff0c;例如设…

RHCE web解析、dns配置、firewalld配置实验

RHCE web解析、dns配置、firewalld配置实验 实验一1.清理软件包2.安装软件包3.配置web服务查看默认测试页面报错讲解12 4.安装DNS解析需要的bind软件包5.修改网络配置&#xff0c;查错&#xff0c;修改权限 实验二配置文件haha.confnamed.confnamed.haha 实验一 1、学习方法 重…

JavaEE进阶----SpringMVC(三)---响应的获取

文章目录 1.cookie和session获取1.1servlet写法获取1.2spring获取cookie1.3传统方法获取session1.4sring获取session内容 2.访问静态页面3.一个项目部署多个服务4.responsebody的介绍5.返回html的片段6.不同相应content-type类型6.1text/html类型6.2application-json类型6.3 js…

Chromium 中MemoryMappedFile使用例子c++

文件映射基础介绍参考微软官网&#xff1a; 使用文件映射 - Win32 apps | Microsoft Learn 在文件中创建视图 - Win32 apps | Microsoft Learn 创建命名的共享内存 - Win32 apps | Microsoft Learn 使用大页面创建文件映射 - Win32 apps | Microsoft Learn 从文件句柄获取…

OpenHarmony4.1蓝牙芯片如何适配?触觉智能RK3568主板SBC3568演示

当打开蓝牙后没有反应时&#xff0c;需要排查蓝牙节点是否对应、固件是否加载成功&#xff0c;本文介绍开源鸿蒙OpenHarmony4.1系统下适配蓝牙的方法&#xff0c;触觉智能SBC3568主板演示 修改对应节点 开发板蓝牙硬件连接为UART1&#xff0c;修改对应的节点&#xff0c;路径为…

前端 JS面向对象 原型 prototype

目录 一、问题引出 二、prototype原型对象 三、小结 四、constructor 五、__proto__对象原型 六、原型链 一、问题引出 由于JS的构造函数存在内存浪费问题&#xff1a; function Star(name,age){this.namenamethis.ageagethis.singfunction () {console.log("唱歌&…

生成 Django 中文文档 PDF 版

文章目录 背景克隆 Django 文档和翻译仓库配置 conf.py设置和同步翻译生成 .pot 文件运行 sphinx-intl update复制翻译文件 构建 PDF生成 tex 文件安装 MikTeX生成 PDF Sphinx 生成文档 背景 浏览看到一个帖子&#xff0c;有个评论说可以用 sphinx 构建一个 pdf&#xff0c;正…

mysql 实现分库分表之 --- 基于 MyCAT 的分片策略详解

引言 在我们日常工作的项目中&#xff0c;特别是面向 C 端用户的产品&#xff0c;随着业务量的逐步扩大&#xff0c;数据量也呈指数级增长。为了应对日益增长的数据库压力&#xff0c;数据库优化已成为项目中不可或缺的一环&#xff0c;而分库分表则是海量数据优化方案中的重要…

JUC-locks锁

JUC-locks锁 1、JUC-locks锁概述2、管程模型3、ReentrantLock可重入锁3.1 ReentrantLock源码3.2 Sync静态内部类3.3 NonfairSync非公平锁3.4 FairSync公平锁 如有侵权&#xff0c;请联系&#xff5e; 如有错误&#xff0c;也欢迎批评指正&#xff5e; 1、JUC-locks锁概述 java…

GEE 数据集——美国gNATSGO(网格化国家土壤调查地理数据库)完整覆盖了美国所有地区和岛屿领土的最佳可用土壤信息

目录 简介 代码 引用 网址推荐 知识星球 机器学习 gNATSGO&#xff08;网格化国家土壤调查地理数据库&#xff09; 简介 gNATSGO&#xff08;网格化国家土壤调查地理数据库&#xff09;数据库是一个综合数据库&#xff0c;完整覆盖了美国所有地区和岛屿领土的最佳可用土…

kettle开发-Day43-数据对比

前言&#xff1a; 随着数字化的深入&#xff0c;各种系统及烟囱的建立&#xff0c;各系统之间的架构和数据存储方式不同&#xff0c;导致做数据仓库或数据湖时发现&#xff0c;因自建的系统或者非标准化的系统经常存在物理删除而不是软删除。这就延伸出一个问题&#xff0c;经常…

哪款开放式耳机好用?5款实力出众的开放式耳机按头安利!

随着耳机市场日益火爆&#xff0c;许多品牌与款式不断涌现。但是&#xff0c;不少劣质产品在核心性能上缺乏专业优化&#xff0c;且选用低质材料&#xff0c;在音质还原度和佩戴舒适性等关键方面存在明显短板&#xff0c;导致性能欠佳&#xff0c;聆听体验不佳&#xff0c;还可…

Unity资源打包Addressable资源保存在项目中

怎么打包先看“Unity资源打包Addressable AA包” 其中遗留一个问题&#xff0c;下载下来的资源被保存在C盘中了&#xff0c;可不可以保存在项目中呢&#xff1f;可以。 新建了一个项目&#xff0c;路径与“Unity资源打包Addressable AA包”都不相同了 1.创建资源缓存路径 在…

矩阵的各种计算:乘法、逆矩阵、转置、行列式等——基于Excel实现

在Excel中,可以使用内置的函数和公式来实现矩阵的各种计算。以下是具体方法: 矩阵乘法: 使用MMULT函数。如图矩阵A在单元格范围A1:B2,矩阵B在单元格范围D1:E2,结果矩阵的左上角单元格为G1:选中结果矩阵的区域(如G1:H2)。输入公式:=MMULT(A1:B2, D1:E2)。按Ctrl+Shift…

[ComfyUI]Flux:繁荣生态魔盒已开启,6款LORA已来,更有MJ6写实动漫风景艺术迪士尼全套

今天&#xff0c;我们将向您介绍一款非常实用的工具——[ComfyUI]Flux。这是一款基于Stable Diffusion的AI绘画工具&#xff0c;旨在为您提供一键式生成图像的便捷体验。无论您是AI绘画的新手还是专业人士&#xff0c;这个工具都能为您带来极大的便利。 在这个教程中&#xff…

【设计模式】关联关系与依赖关系

UML 图将事物之间的联系分为 6 种&#xff1a;关联、依赖、聚合、组合、泛化、实现 我认为关联关系和依赖关系非常不好理解。 我们看下定义&#xff1a; 关联&#xff1a;表示一种拥有的关系。具有方向性。如果一个类单方向的访问另一个类&#xff0c;称为单向关联。如果两个类…

前端Cypress自动化测试全网详解

Cypress 自动化测试详解&#xff1a;从安装到实战 Cypress 是一个强大的端到端&#xff08;End-to-End, E2E&#xff09;功能测试框架&#xff0c;基于 Node.js 构建&#xff0c;支持本地浏览器直接模拟测试&#xff0c;并具有测试录屏功能&#xff0c;极大地方便了测试失败时的…