当前位置: 首页 > article >正文

学习vue3:跨组件通信(provide+inject)

目录

一,关于跨组件通信概述

二,跨组件传值

案例1(爷传孙)

三,跨组件传函数

案例2(爷传孙)

疑问:孙子传给爷爷是否可行呢?


一,关于跨组件通信概述

之前我们学习了父子组件的传值,它仅仅只是两个组件嵌套传递数据,跨组件通信,则是多个组件传递数据。如:现在有三个组件:App.vue,father.vue,son.vue,我把App.vue看作爷爷,father.vue看作父亲,son.vue看作儿子。现在我要将数据从爷爷传给孙子,就可以使用跨组件通信。

提示

跨组件通信:使用 provide+inject的方式适用于需要跨层级共享数据的场景

但需注意不要滥用。如果组件层级较深,且需要在多个组件之间共享状态,可以使用 Vuex 或 Pinia 等状态管理工具(后面也会讲)


二,跨组件传值

案例1(爷传孙)

App.vue

<script setup>
import father from './views/father.vue';
import { provide,ref,reactive} from 'vue';
const data=ref(1234567890)
const dataObj=reactive({name:'张三',age:20})
provide('data',data)
provide('dataObj',dataObj)
</script>
<template>
<father></father>
</template><style scoped></style>

father.vue

<template><div>爷爷传给父亲的基本数据值:{{ father }}<br/>
爷爷传给父亲的对象值:{{ father1 }}</div></template><script setup>import { inject,ref } from 'vue';const father = inject('data');const father1 = inject('dataObj');const a=ref('')a.value=father.valueconsole.log(a.value)a.value=father1.nameconsole.log(a.value)</script><style lang="scss" scoped></style>

son.vue

<template><div>
爷爷传给孙子的基本数据:{{ parent }}<br>爷爷传给孙子的对象数据:{{ parent2 }}</div>
</template><script setup>
import { inject } from 'vue';
const parent = inject('data');
const parent2 = inject('dataObj');
console.log(parent2);
</script><style lang="scss" scoped></style>

测试结果

三,跨组件传函数

案例2(爷传孙)

son.vue

<template><button @click="count">爷爷传递的函数</button>
</template><script setup>
import { inject ,provide,ref} from 'vue';
const count=inject('count')
</script><style lang="scss" scoped></style>

App.vue

<script setup>
import father from './views/father.vue';
import { provide, inject,ref,reactive} from 'vue';
const count=ref(0)
const countNum=()=>{count.value++
}
provide('count',countNum)
</script><template>
<father>
</father>
<br/>
<h4>当孙子点击爷爷发送自增函数,数据:{{ count }}</h4>
</template><style scoped></style>

测试结果

总结:跨组件通信,无法做到孙子传给爷爷,但在组件中可以多次使用provide 或inject函数


疑问:孙子传给爷爷是否可行呢?

案例3(孙传爷)

son.vue

<template><div>爷爷传给孙子的基本数据:{{ parent }}<br>爷爷传给孙子的对象数据:{{ parent2 }}</div>
</template><script setup>
import { inject ,provide,ref} from 'vue';
const parent = inject('data');
const parent2 = inject('dataObj');
console.log(parent2);
const son = ref(11111)
provide("dataSon",son)
</script><style lang="scss" scoped></style>

App.vue

<script setup>
import father from './views/father.vue';
import { provide, inject,ref,reactive} from 'vue';
const data=ref(1234567890)
const dataObj=reactive({name:'张三',age:20})
provide('data',data)
provide('dataObj',dataObj)
const son=inject('dataSon')
console.log("son:",son)
</script><template>
<father>
</father>
</template><style scoped></style>

测试结果

http://www.lryc.cn/news/2387763.html

相关文章:

  • Alibaba Sentinel 入门教程:从理论到实战
  • 2.3 TypeScript 非空断言操作符(后缀 !)详解
  • 【菜狗work前端】小程序加if判断时不及时刷新 vs Web
  • 01 NLP的发展历程和挑战
  • TCP 三次握手:详解与原理
  • LabVIEW累加器标签通道
  • 在 Unity 中,Start 方法直接设置 RectTransform 的位置,时出现问题,与预计位置不匹配。
  • 永磁同步电机控制算法--IP调节器
  • Ubuntu 25.04 锁屏不能远程连接的解决方案
  • Java 自动装箱和拆箱还有包装类的缓存问题
  • java-jdk8新特性Stream流
  • 大语言模型 21 - MCP 自动操作 Figma+Cursor 实现将原型转换为代码
  • QNAP NEXTCLOUD 域名访问
  • Spring MVC深度解析:控制器与视图解析及RESTful API设计最佳实践
  • 华为OD机试真题——信道分配(2025B卷:200分)Java/python/JavaScript/C/C++/GO最佳实现
  • 比亚迪“双剑”电池获中汽中心权威认证,堪称“移动安全堡垒”。
  • 【mysql】mysql的高级函数、高级用法
  • 了解一下C#的SortedSet
  • 【平面波导外腔激光器专题系列】用于光纤传感的低噪声PLC外腔窄线宽激光器
  • Pytorch里面多任务Loss是加起来还是分别backward? | Pytorch | 深度学习
  • K8S Pod调度方法实例
  • 【mindspore系列】- 算子源码分析
  • 学习日记-day17-5.27
  • 一种比较精简的协议
  • 网络常识:网线和光纤的区别
  • OpenCV CUDA模块图像过滤------创建一个 Scharr 滤波器函数createScharrFilter()
  • html css js网页制作成品——HTML+CSS+js醇香咖啡屋网页设计(5页)附源码
  • [特殊字符] 构建高内聚低耦合的接口架构:从数据校验到后置通知的分层实践
  • brep2seq 源码笔记2
  • UE5 蓝图,隐藏一个Actor,同时隐藏它的所有子物体