vue3和vue2 之 provide/inject 用法区别 ---vue3组件间通讯2

一、为什么用他们?

 provide/inject 主要用于父组件和子孙组件间通讯,不用在父传子,子传孙,孙传重孙等数据传递了(解决了Prop 逐级透传问题)。简单的父子组件间传值还是使用props、emits或是defineProps、defineEmits、defineExpose比较方便。

二、原理 与 区别

父组件中提供数据,并在其后代的组件树,无论层级有多深,都可以中注入这些数据,从而实现了组件之间的数据传递。。

1. 在vue2中,组件实例方法和属性的继承是通过原型链来实现。

  • 当一个组件通过 provide 提供数据,它会将这些数据添加到其原型链上,然后子组件通过 inject 可以在原型链上查找并访问这些数据。
  • vue 会遍历父组件链,通过匹配provide( key,value)和inject(key,default [可选])的 key 来确定所提供的值。如果父组件链上多个组件对同一个 key 提供了值,那么离得更近的组件将会“覆盖”链上更远的组件所提供的值。如果没有能通过 key 匹配到值,inject() 将返回 undefined,除非提供了一个默认值。

2. 在 Vue 3 中 组件不再依赖于原型链,而是 引入了 Composition API,直接导出给组件实例。

  • provide 是在父组件中使用的选项,它是一个函数,会在父组件实例上创建一个名为 _provided 的对象。_provided 对象存储了提供给子组件的数据,而且这些数据会在整个组件树中可用,子组件可以通过inject选项来访问这些数据。
  • 当子组件访问通过inject注入的数据时,Vue 3会在组件树中向上搜索父组件,一旦找到包含提供数据的组件,Vue 3会从该组件的_provided属性中获取相应的数据。
  • 如果提供的数据是响应式的,子组件将自动成为这些数据的依赖,当提供的数据发生变化时,子组件将被通知并进行更新。 

三、使用方式

1. vue2中的使用

父组件:

// 1. 对象形式
export default{provide:{info:"哈哈哈"}}//2. provide 需要使用 data 内的数据(访问组件实例 property)时,需要将 provide 转换为返回对象的函数。
export default{data() {return {msg: "哈哈哈"};},provide() {return {info: this.msg //提供祖先组件的实例};},
}

后代组件:

// 1. 
export default{inject:['info'],mounted(){console.log("接收数据:", this.info) // 接收数据:哈哈哈}}//2. 或者 对象形式
<template><div><P>姓名:{{info.msg}}</P></div>
</template><script>
export default {inject: {info: {from: 'info', // 当声明注入的默认值时,必须使用对象形式,与原注入名同名时,这个属性可选 default: 'default value'}} 
};
</script>

2. vue3中的使用

父组件:

//1. 
<script>
import { provide } from "vue"export default {setup(){provide('info',"哈哈哈");provide('changeSubmitLoading', (val) => {submitLoading.value = val})}
}
</script>// 2. 添加响应性
<script setup>import { provide, ref } from 'vue'const location = ref('哈哈哈')function updateLocation() {location.value = '吼吼吼'
}provide('location', {location,updateLocation
})
</script>

后代组件:

// 1. 
<template> {{info}}
</template><template #cell="{ record }"><a-button size="mini" type="text"  @click="handleDelete(record)"></a-button>
</template><script>
import { inject } from "vue"export default {setup(){const info = inject('info')const changeSubmitLoading = inject('changeSubmitLoading')const handleDelete = (record) => {/* 方法内其他内容*/  changeSubmitLoading(true)}return{info}}
} 
</script>//2. 添加响应性后<template><button @click="updateLocation">{{ location }}</button>
</template><script setup>
import { inject } from 'vue'const { location, updateLocation } = inject('location')
</script>

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

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

相关文章

输入nvidia-smi查看的GPU的容量和在docker里输入df -Th查看的shm有联系吗

nvidia-smi命令用于查看GPU的状态和相关信息&#xff0c;而df -Th命令用于查看文件系统的磁盘使用情况&#xff0c;包括共享内存&#xff08;shm&#xff09;的使用情况。 这两个命令提供了不同层面的信息&#xff0c;因此它们之间没有直接的联系。具体来说&#xff1a; nvidi…

call、apply、bind是如何实现改变this的

call, apply, 和 bind 方法都是通过改变函数的执行上下文&#xff08;this&#xff09;来实现改变 this 的。 1. call 方法 call 方法&#xff1a;call 方法通过将函数作为对象的方法调用&#xff0c;并传递一个新的上下文对象作为第一个参数来改变函数的执行上下文。函数内部可…

从无到有开始创建动态顺序表——C语言实现

顺序表的概念 顺序表的底层结构是数组&#xff0c;对数组的封装&#xff0c;实现了常用的增删改查等接口。在物理结构和逻辑结构都是连续的&#xff0c;物理结构是指顺序表在计算机内存的存储方式&#xff0c;逻辑结构是我们思考的形式&#xff0c;顺序表和数组是类似的&#x…

【御控物联】JavaScript JSON结构转换(14):对象To数组——规则属性重组

文章目录 一、JSON结构转换是什么&#xff1f;二、术语解释三、案例之《JSON对象 To JSON数组》四、代码实现五、在线转换工具六、技术资料 一、JSON结构转换是什么&#xff1f; JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换&#xff0…

中医肝胆笔记

目录 肝胆的经络足厥阴肝经足少阳胆经 疏肝健脾的药舒肝益脾颗粒&#xff1a;逍遥丸&#xff1a;疏肝颗粒 -> 疏肝理气的力度大-> 肝郁的程度深&#xff0c;逍遥丸没用的是时候用这个加味逍遥丸 -> 清热的力度最大->适用 肝郁火大&#xff0c;舌苔黄丹栀逍遥丸->…

LangChain Demo | 如何调用stackoverflow并结合ReAct回答代码相关问题

背景 楼主决定提升与LLM交互的质量&#xff0c;之前是直接prompt->answer的范式&#xff0c;现在我希望能用上ReAct策略和能够检索StackOverflow&#xff0c;让同一款LLM发挥出更大的作用。 难点 1. 怎样调用StackOverflow step1 pip install stackspi step 2 from la…

使用阿里云试用Elasticsearch学习:1.7 基础入门——索引管理

我们已经看到 Elasticsearch 让开发一个新的应用变得简单&#xff0c;不需要任何预先计划或设置。 不过&#xff0c;要不了多久你就会开始想要优化索引和搜索过程&#xff0c;以便更好地适合您的特定用例。 这些定制几乎围绕着索引和类型的方方面面&#xff0c;在本章&#xff…

基于单片机的有害气体检查系统设计

**单片机设计介绍&#xff0c;基于单片机的有害气体检查系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的有害气体检查系统设计旨在实现对环境中各种有害气体的实时监测与报警&#xff0c;保障人员健康和环境…

numpy库read_excek,读取函数

文件说明&#xff1a; 版本&#xff1a;window 10 python3.10 解决的问题&#xff1a;pandas库如何读取excel文件 使用pandas库读取Excel文件可以通过以下步骤实现&#xff1a; 1.首先&#xff0c;确保你已经安装了pandas库。可以使用以下命令在Python环境中安装pandas库&…

如何使用NumPy处理数组翻转与变形

NumPy是Python中一个强大的库&#xff0c;主要用于处理大型多维数组和矩阵的数学运算。处理数组翻转与变形是NumPy的常用功能。 1.对多维数组翻转 n np.random.randint(0,100,size(5,6))n# 执行结果array([[ 9, 48, 20, 85, 19, 93], [ 1, 63, 20, 25, 19, 44], …

用 Wireshark 解码 H.264

H264&#xff0c;你不知道的小技巧-腾讯云开发者社区-腾讯云 这篇文章写的非常好 这里仅做几点补充 init.lua内容&#xff1a; -- Set enable_lua to false to disable Lua support. enable_lua trueif not enable_lua thenreturn end-- If false and Wireshark was start…

【蓝桥杯每日一题】4.1 奶酪

我天&#xff01;哥们经过两个周的忙碌又重生了&#xff01; 原题链接&#xff1a;528. 奶酪 - AcWing题库 本题注意点&#xff1a; 注意几个边界值&#xff0c;如果说没有球连接顶部或者底部&#xff0c;老鼠是不可能上来的&#xff0c;直接say no!要利用公式判断两个球是相…

零基础轻松入门Java数据库连接(JDBC)

什么是JDBC&#xff1f; Java数据库连接&#xff08;JDBC&#xff09;就像是Java程序和数据库之间的翻译官。它是一个官方的标准接口集&#xff0c;让Java程序能和不同的数据库“对话”。甭管你是在跟MySQL、Oracle还是SQL Server打交道&#xff0c;只要有了JDBC&#xff0c;J…

OpenCV入门例程:裁剪图片、模糊检测、黑屏检测

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 本例程运行环境为CentOS7&…

AI创业机会的探索

AI创业机会的探索 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已成为当今世界的重要技术之一。AI的广泛应用不仅改变了我们的生活方式&#xff0c;也为创业者带来了前所未有的机会。以下&#xff0c;我们将一起探讨AI领域中的一些创业机会。 一、智能…

JS详解-函数柯里化

简介&#xff1a; 柯里化&#xff08;Currying&#xff09;是一种关于函数的高阶技术。柯里化是一种函数的转换&#xff0c;它是指将一个函数从可调用的 f(a, b, c) 转换为可调用的 f(a)(b)(c)。柯里化不会调用函数。它只是对函数进行转换。 举个例子&#xff1a; 已最简单的…

图像处理入门 3(how to get the pixel pitch / 如何获得单个像素的尺寸)

在这里一节里面&#xff0c;将记录如何获得一个相机传感器中单个像素点的尺寸&#xff0c;为了实现不同相机照片之间的匹配。 如果我们知道了相机传感器的尺寸和分辨率的大小&#xff0c;自然就可以求出单个像素的大小。 在这里插入图片描述&#xff1a; 如何获得相机传感器的…

Redis 怎么发布订阅

在Redis中&#xff0c;发布-订阅模式&#xff08;Pub/Sub&#xff09;允许客户端&#xff08;订阅者&#xff09;订阅频道&#xff0c;并接收其他客户端&#xff08;发布者&#xff09;发送到该频道的消息。下面是如何在Redis中使用发布-订阅模式的简要说明&#xff1a; 订阅频…

C++多线程:async、future、packaged_task、promise、shared_future的学习与使用(九)

1、异步任务线程 异步线程的概念&#xff1a; 异步&#xff1a;就是非同步&#xff0c;同步就是必须一个一个的执行&#xff0c;异步可以两个事情一起干异步线程&#xff1a;异步线程就相当于把非关联的两件事分开找两个线程去执行&#xff0c;而分开的那个就是异步线程举例&am…