【Vue.js 3.0】provide 、inject 函数详解
- 在 Vue 3 中,
provide
和inject
是用于跨组件层次结构进行依赖注入的一对 API。 - 这些 API 主要用于祖先组件和后代组件之间的数据传递,尤其是当这些组件之间没有直接的父子关系时。
1. 示例
1.1 provide
provide
函数用于在祖先组件中定义一个值,使得其所有后代组件都可以使用 inject
来访问这个值。
用法:
provide(key, value)
key
:一个字符串或 Symbol,用于唯一标识所提供的值。value
:所提供的值,可以是任何类型。
1.2 inject
inject
函数用于在后代组件中访问祖先组件通过 provide
所提供的值。
用法:
const value = inject(key, defaultValue)
key
:与provide
相同的字符串或 Symbol。defaultValue
:一个可选的默认值,当provide
没有提供该key
对应的值时,inject
将返回这个默认值。
例
假设我们有一个祖先组件 GrandParent
,一个中间组件 Parent
,以及一个后代组件 Child
。我们希望从 GrandParent
传递一个数据到 Child
。
GrandParent.vue
<template><Parent />
</template><script setup>
import { provide } from 'vue';
import Parent from './Parent.vue';const theme = 'dark';
provide('theme', theme);
</script>
Parent.vue
<template><Child />
</template><script setup>
import Child from './Child.vue';
</script>
Child.vue
<template><div :class="theme">I am a child component with {{ theme }} theme.</div>
</template><script setup>
import { inject } from 'vue';const theme = inject('theme', 'light'); // 'light' 是默认值,如果 provide 没有提供 'theme'
</script><style scoped>
.dark {background-color: black;color: white;
}.light {background-color: white;color: black;
}
</style>
2. 实现原理
2.1 Vue.js 2.0
- 在 Vue.js 2.0 中组件实例方法和属性的继承是通过原型链来实现的,而 provide 和 inject 就是基于原型链的属性访问来实现跨组件通信。
- 当一个组件通过 provide 提供数据,它会将这些数据添加到其原型链上,然后子组件通过 inject 可以在原型链上查找并访问这些数据。
2.2 Vue.js 3.0
- 在 Vue 3 中 组件的实例方法和属性的继承不再依赖于原型链,而是 引入了 Composition API,它采用了一种不同的方式来组织组件的代码和状态。
- 组件的选项被重构为一个配置对象,其中 setup 函数用于定义组件的响应式数据、计算属性、方法等。
- 这些选项不再依赖于原型链,而是直接导出给组件实例。
2.3 改进带来了以下好处
- 更稳定的数据提供:在 Vue 3 中,每个组件实例都有自己的私有作用域,不会受到原型链的影响,因此不存在 Vue 2 中的潜在问题。
- 更好的类型检查:在 Vue 3 中,TypeScript 或 Flow 等类型检查工具可以更准确地检测到 inject 注入的数据类型。
详解
2.2.1 provide
的原理
provide
在父组件中使用的选项,用于提供数据给子组件。它实际上是一个函数,它会在父组件实例上创建一个名为_provided
的对象。_provided
对象存储了提供给子组件的数据,而且这些数据会在整个组件树中可用,子组件可以通过 inject 选项来访问这些数据。- 当父组件提供的数据发生变化时,
Vue 3
的响应式系统会追踪这些变化并通知所有依赖这些数据的子组件进行更新。
2.2.2 inject
的原理
- 子组件通过
inject
选项声明需要注入的数据,可以是一个数组、一个对象或一个函数。这些声明告诉Vue 3
要从父组件的提供数据中获取哪些属性。 - 当子组件访问通过
inject
注入的数据时,Vue 3
会在组件树中向上搜索父组件,直到找到包含提供数据的组件或到达根组件。 - 一旦找到包含提供数据的组件,
Vue 3
会从该组件的_provided
属性中获取相应的数据。 - 如果提供的数据是响应式的,子组件将自动成为这些数据的依赖,当提供的数据发生变化时,子组件将被通知并进行更新。
优点:
- 解耦合(Decoupling): provide 和 inject 有助于降低组件之间的耦合度。组件不需要直接了解其依赖项的实现细节,而是通过注入来访问这些依赖,这使得组件更加独立和可复用。
- 可测试性(Testability): 依赖注入使得单元测试更加容易。你可以轻松地注入模拟对象或测试替身,以测试组件的行为,而不需要实际的外部依赖。
- 可维护性(Maintainability): 通过将依赖项提取到外部并通过 provide 注入,代码变得更清晰和易于维护。这对于大型应用程序来说特别有价值。
- 可扩展性(Scalability): provide 和 inject 可以用于共享全局配置、服务或状态管理等全局性的依赖项,使得应用程序更容易扩展和维护。
缺点:
- 复杂性(Complexity): 对于小型应用来说,使用 provide 和 inject 可能会增加一些不必要的复杂性。这些特性最有价值的地方通常在大型和复杂的应用程序中。
- 容易滥用(Overuse): 有时开发人员可能会滥用 provide 和 inject,将所有东西都注入到组件中,导致不必要的复杂性和混乱。需要谨慎权衡。
- 不适用于所有场景(Not Suitable for All Scenarios): provide 和 inject 更适合用于共享全局配置和服务等情况,对于局部的、仅在某个组件内部使用的依赖项,使用 props 更合适。
3.注意事项
- 响应性:通过
provide
提供的值不会自动具有响应性。如果需要响应性,应该提供一个响应式对象或使用
reactive
、ref
等 Vue 的响应式 API。 - 循环依赖:虽然 provide 和 inject 强大,但应谨慎使用,以避免组件间的循环依赖。
- 作用范围:provide 和 inject 的作用范围仅限于当前的组件树,无法跨组件树使用。通过使用
provide
和inject
,开发者可以在Vue 3
应用中灵活地管理跨组件的数据共享和依赖注入。
4.参考资料
参考博客
相关文章:

【Vue.js 3.0】provide 、inject 函数详解
在 Vue 3 中,provide 和 inject 是用于跨组件层次结构进行依赖注入的一对 API。这些 API 主要用于祖先组件和后代组件之间的数据传递,尤其是当这些组件之间没有直接的父子关系时。 1. 示例 1.1 provide provide 函数用于在祖先组件中定义一个值&#…...

JVM(Java虚拟机)的虚拟机栈
JVM(Java虚拟机)的虚拟机栈是Java程序运行时的重要组件,以下是对其的详细解析: 一、概念与功能 概念:虚拟机栈也称为Java栈,是JVM为每个线程分配的一个私有的内存区域。每个线程在创建时都会创建一个虚拟…...

Elasticsearch02-安装7.x
零、文章目录 Elasticsearch02-安装7.x 1、Windows安装Elasticsearch (1)JDK安装 Elasticsearch是基于java开发的,所以需要安装JDK。我们安装的Elasticsearch版本是7.15,对应JDK至少1.8版本以上。也可以不安装jdk,…...

iPhone恢复技巧:如何从 iPhone 恢复丢失的照片
在计算机时代,我们依靠手机来捕捉和存储珍贵的回忆。但是,如果您不小心删除或丢失了手机上的照片怎么办?这真的很令人沮丧和烦恼,不是吗?好吧,如果您在 iPhone 上丢失了照片,您不必担心…...

vba批量化调整word的图和图表标题
vba代码 将图片进行居中操作 Sub ChangePictureFormate()Dim oPara As ParagraphDim oRange As RangeDim i As LongDim beforeIsPicture As BooleanbeforesIsPicture False 确保文档中至少有图片If ActiveDocument.InlineShapes.Count 0 ThenMsgBox "没有找到图片。&qu…...

【Flutter_Web】Flutter编译Web第二篇(webview篇):flutter_inappwebview如何改造方法,变成web之后数据如何交互
前言 欢迎来到第二篇文章,这也是第二个难题,就是原有的移动端本身一些页面H5的形式去呈现(webview),例如某些需要动态更换内容的页面,某些活动页面、支付页面,不仅仅做页面呈现,还包…...

【C语言的奥秘11】指针知识点总结(续)
目录 一、指针的运算 1、指针与整数相加减 2、指针-指针(地址-地址) 3、指针的关系运算 六、指针和数组 七、二级指针 八、指针数组 一、指针的运算 1、指针与整数相加减 看一下下面的代码: #include<stdio.h> int my_strlen(c…...

excel 列名是数据表 的字段名 ,单元格的值 是数据表对应字段的值,生成sql插入语句
在 Excel 中,按 Alt F11 打开 VBA 编辑器。在菜单栏选择 插入 -> 模块,在新模块中粘贴以下代码。 VBA 代码 Sub GenerateSQLInsertStatementsToFile()Dim ws As WorksheetDim lastRow As Long, lastCol As Long, i As Long, j As LongDim sql As S…...

AI Agent与MEME:技术与文化融合驱动Web3创新
AI Agent如何引领Web3新时代? 随着Web3与区块链技术的迅速发展,AI Agent作为人工智能与区块链的交汇点,正在逐步成为推动去中心化生态的重要力量。同时,MEME文化凭借其强大的社区驱动力和文化渗透力,在链上生态中扮演着…...

IO的入门
目录 1.IO概述1.1流的分类 2.字符流2.1 案例 1.IO概述 IO(Input/Output):输入和输出,指的是某个设备或环境进行数据的输入或者输出。例如:键盘的输入,再比如显示器就是输出设备,输出图像。 对于java来说输…...

构建一个rust生产应用读书笔记四(实战1)
我们需要从访客那里收集哪些信息,以便将其登记为电子邮件通讯的订阅者? 电子邮件地址:这是最基本的要求,因为我们需要通过电子邮件地址向订阅者发送内容。姓名:虽然这不是强制性的,但我们希望收集一个名字…...

SpringCloudAlibaba | Sentinel从基础到进阶
一、Sentinel简介 Sentinel是SpringCloudAlibaba的一个组件,主要用于解决微服务架构中的高可用性和稳定性问题(雪崩问题)。 常见的使用场景有: 流量控制舱壁模式(线程隔离)超时处理熔断降级 二、流量控…...

算法刷题Day18: BM41 输出二叉树的右视图
题目链接 描述 思路: 递归构造二叉树在Day15有讲到。复习一下,就是使用递归构建左右子树。将中序和前序一分为二。 接下来是找出每一层的最右边的节点,可以利用队列层次遍历。 利用队列长度记录当前层有多少个节点,每次从队列里…...

【信息系统项目管理师-论文真题】2015下半年论文详解(包括解题思路和写作要点)
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论题一:大项目或多项目的成本管理解题思路写作要点论题二:项目的采购管理解题思路写作要点论题一:大项目或多项目的成本管理 随着移动互联网、物联网、云计算、大数据等新一代信息技术的广泛应用,我国目前…...

Windows如何安装go环境,离线安装beego
一、安装go 1、下载go All releases - The Go Programming Language 通过网盘分享的文件:分享的文件 链接: https://pan.baidu.com/s/1MCbo3k3otSoVdmIR4mpPiQ 提取码: hxgf 下载amd64.zip文件,然后解压到指定的路径 2、配置环境变量 需要新建两个环境…...

JavaScript网络请求( XMLHttpRequest 对象,进度事件, 跨源资源共享)
一、 XMLHttpRequest 对象 IE5 是第一个引入 XHR 对象的浏览器。这个对象是通过 ActiveX 对象实现并包含在 MSXML 库中 的。为此, XHR 对象的 3 个版本在浏览器中分别被暴露为 MSXML2.XMLHttp 、 MSXML2.XMLHttp.3.0 和 MXSML2.XMLHttp.6.0 。 所有现代…...

计算机网络信息系统安全问题及解决策略
目 录 摘 要 前 言 一、计算机网络信息系统研究现状及安全技术 (一)计算机网络信息系统研究现状 (二)计算机网络信息系统全技术概述 二、计算机网络信息系统安全问题 (一)环境危害引发的安全问…...

解决并发情况下调用 Instruct-pix2pix 模型推理错误:index out of bounds 问题
解决并发情况下调用 Instruct-pix2pix 模型推理错误:index out of bounds 问题 背景介绍 在对 golang 开发的 图像生成网站 进行并发测试时,调用基于 Instruct-pix2pix 模型和 FastAPI 的图像生成 API 遇到了以下错误: Model inference er…...

你了解TCP/IP参考模型吗
前言 这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱 你了解TCP/IP参考模型吗 一. TCP/IP参考模型二. TCP/IP模型图解三. TCP/IP模型的对比与OSI模型四. TCP/IP协议族五. 总结 TCP/IP参考…...
高斯混合模型及最大期望算法(EM)聚类
混合高斯分布(Gaussian Mixture Model,GMM)是一种概率模型,用于表示具有多个高斯分布的加权组合的数据集。它被广泛应用于模式识别、聚类分析和密度估计等领域。 定义 混合高斯分布由多个单变量或多变量高斯分布的线性组合组成。…...

批处理命令的语法与功能
目录 案例一 echo命令语法及应用 案例二 命令语法及应用 案例三 goto命令语法及应用 案例四 pause命令语法及应用 案例五 call命令语法及应用 案例六 start命令语法及应用 案例七 rem命令语法及应用 案例八 if命令语法及应用 案例九 set命令的语法及应用 案例十 setl…...

33. Three.js案例-创建带阴影的球体与平面
33. Three.js案例-创建带阴影的球体与平面 实现效果 知识点 WebGLRenderer (WebGL渲染器) WebGLRenderer 是 Three.js 中用于渲染 3D 场景的核心类。它负责将场景中的对象绘制到画布上。 构造器 new THREE.WebGLRenderer(parameters)参数类型描述parametersObject可选参数…...

Three.js材质纹理扩散过渡
Three.js材质纹理扩散过渡 import * as THREE from "three"; import { ThreeHelper } from "/src/ThreeHelper"; import { LoadGLTF, MethodBaseSceneSet } from "/src/ThreeHelper/decorators"; import { MainScreen } from "/src/compone…...

免费开源!推荐一款网页版数据库管理工具!
免费开源!推荐一款网页版数据库管理工具! DBGate 是一个开源的数据库管理工具,DBGate 的最大特点是可以 Web 访问!,轻松实现一台机器部署,所有人使用! 无论是 MySQL、PostgreSQL、SQLite 还是…...

生态系统NPP及碳源、碳汇模拟实践技术应用(土地利用变化、未来气候变化、空间动态模拟)
由于全球变暖、大气中温室气体浓度逐年增加等问题的出现,“双碳”行动特别是碳中和已经在世界范围形成广泛影响。碳中和可以从碳排放(碳源)和碳固定(碳汇)这两个侧面来理解。陆地生态系统在全球碳循环过程中有着重要作…...

Mvc、Springmvc框架
一.Mvc: 1.概念: MVC它是一种设计理念。把程序按照指定的结构来划分: Model模型 、View视图 、Controller控制层; 结构图: 二.Springmvc: 1.概念: springmvc框架它是spring框架的一个分支。它是按照mvc架构思想设计…...

MATLAB2021B APP seriallist 串口通信
文章目录 前言一、项目需要二、使用步骤1.查找串口填写到查找列表2.发送函数3. 接收函数4.检测串口按钮5.选择串口号 总结 前言 提示:这里可以添加本文要记录的大概内容: 项目需要: 提示:以下是本篇文章正文内容,下面…...

【Python爬虫系列】_033.Scrapy_分布式爬虫
课 程 推 荐我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)教程合集 👈👈…...

2025erp系统开源免费进销存系统搭建教程/功能介绍/上线即可运营软件平台源码
系统介绍 基于ThinkPHP与LayUI构建的全方位进销存解决方案 本系统集成了采购、销售、零售、多仓库管理、财务管理等核心功能模块,旨在为企业提供一站式进销存管理体验。借助详尽的报表分析和灵活的设置选项,企业可实现精细化管理,提升运营效…...

Android实战经验篇-busybox小工具
Android开发系列文章请转如下链接 Android实战经验篇-系列文章 Android Display Graphics系列文章-汇总 俗话说“工欲善其事,必先利其器!” 在原生Android系统中,提供的基础调试命令是基于toybox的。支持的命令不够全面,而Busy…...