Vue3 源码解读系列(九)——依赖注入

依赖注入

依赖注入用于祖先组件向后代组件传递数据。

特点:

祖先组件不需要知道哪些后代组件在使用它提供的数据。

后代组件也不需要知道注入的数据来自哪里。

在这里插入图片描述

/*** provide 的实现*/
function provide(key, value) {let provides = currentInstance.provides // 当前实例的 providesconst parentProvides = currentInstance.parent && currentInstance.parent.provides // 父组件的 provides// 判断 key 重复,子组件实例的 key:value 会覆盖父组件的if (parentProvides === provides) {provides = currentInstance.provides = Object.create(parentProvides)}provides[key] = value
}// 组件实例的 provides 对象指向父组件实例的 provides 对象
const instance = {provides: parent ? parent.provides : Object.craete(appContext.provides), // 依赖注入相关// others...
}
/*** inject 的实现*/
function inject(key, defaultValue) {const instance = currentInstance || currentRenderingInstanceif (instance) {const provides = instance.provides// 存在 key,则返回对应的 valueif (key in provides) {return provides[key]}// 不存在 key,则返回默认值 defaultValueelse if (arguments.length > 1) {return defaultValue}// 如果都不成立,则在非生产环境报警告else if ((process.env.NODE_ENV !== 'production')) {warn(/* ... */)}}
}

依赖注入 (provide/inject) 与模块导出导入 (export/import) 的区别:

  1. 作用域不同

    • 依赖注入的作用域是局部范围,把数据注入这个节点为根的后代组件中
    • 模块化的作用域是全局范围的,在任何地方引用它导出的数据
  2. 数据来源不同

    • 使用依赖注入,后代组件不需要注入的数据来自哪里
    • 使用模块化,后代组件必须要知道数据定义在哪个文件
  3. 上下文不同

    • 依赖注入根据不同的组件上下文提供不同的数据给后代组件
    • 模块化则是从 API 层面上来做设计

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

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

相关文章

【LSTM】北京pm2.5 天气预测--pytorch版本,有代码可以跑通-LSTM回归问题,工程落地一网打尽

文章目录 前言1. 知识理解1.1 核心理解1.2 原理1.2.1 图解LSTM1.2.1 分词1.2.1 英语的词表示1.2.2 中文的词表示1.2.3 构建词表 2. 工程代码2.1 数据预处理2.2 数据集&模型构建2.3 模型训练2.4 保持模型&加载模型&预测 前言 LSTM 少分析原理,更强调工程…

网络渗透测试(TCP/IP)理论篇

TCP/IP体系 垂直服务:底层为高层服务 TCP/IP体系结构是一个分层的协议体系,由多个层次组成,每个层次都负责不同的功能。以下是TCP/IP体系结构的主要层次: 物理层(Physical Layer):该层负责传输…

Debian系列的Linux发行版上部署wvp

Debian系列的Linux发行版上部署wvp 环境搭建1.Debian系列的Linux发行版上安装nginx2.安装mysql设置mysql密码修改权限sudo mysql ERROR 1045 (28000): Access denied for user root@localhost (using password: NO)配置相关navicat 连接不上 报错 10061navicat 连接报错 1130 -…

Python选择排序和冒泡排序算法

选择排序和冒泡排序都是常见的排序算法。以下是这两种算法的Python实现: 选择排序(Selection Sort) 选择排序的基本思想是在未排序的序列中找到最小(或最大)元素,存放到排序序列的起始位置,然…

grafana面板介绍

grafana 快速使用 背景 随着公司业务的不断发展,紧接来的是业务种类的增加、服务器数量的增长、网络环境的越发复杂以及发布更加频繁,从而不可避免地带来了线上事故的增多,因此需要对服务器到应用的全方位监控,提前预警&#xf…

MATLAB | 官方举办的动图绘制大赛 | 第二周赛情回顾

今天带来一下MATHWORKS官方举办的迷你黑客大赛第三期(MATLAB Flipbook Mini Hack)的最新进展!!目前比赛已经进行了两周非常荣幸能够成为第一周的阶段性获奖者: 本来并不打算每周进行一次赛况讲解,但是由于字符限制改成了2000&…

何时使用Elasticsearch而不是MySql?

何时使用Elasticsearch而不是MySql? MySQL 和 Elasticsearch 是两种不同的数据管理系统,它们各有优劣,适用于不同的场景。本文将从以下几个方面对它们进行比较和分析: 数据模型查询语言索引和搜索分布式和高可用性能和扩展性使用…

Linux系统编程 day02 vim、gcc、库的制作与使用

Linux系统编程 day02 vim、gcc、库的制作与使用 01. vim0101. 命令模式下的操作0102. 切换到文本输入模式0103. 末行模式下的操作0104. vim的配置文件 02. gcc03. 库的制作与使用0301. 静态库的制作与使用0302. 动态库(共享库)的制作与使用 01. vim vim是一个编辑器&#xff0…

adb突然获取不到华为/荣耀手机。。。

手机一开始都是好好的,adb获取正常,adb执行命令正常。突然有一天不好使了。。。。。 重启、换usb线都试过。。。。。。 看到hisuite模式和adb冲突这篇帖子,尝试下载华为手机助手去链接,但一直连接不上。 最后我的处理方法是&#…

Run Legends将健身运动游戏化,使用户保持健康并了解Web3游戏

最近,我们有机会采访Talofa Games的首席执行官兼创始人Jenny Xu,一起讨论游戏开发,Talofa Games是Run Legends这款健身游戏的开发工作室。她已经创作了超过一百款游戏,对于推动游戏的可能性并将她的创造力和叙事技巧带入她最喜爱的…

代码随想录算法训练营Day36 —— 738.单调递增的数字

738.单调递增的数字 思路: 题目要求小于等于N的最大单调递增的整数,那么拿一个两位的数字来举例。 例如:98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]…

POS系统完整体系的介绍 Pos终端主密钥MK、DUKPT、PEK、DEK、MEK、TUSN的含义 ---安全行业基础篇7

POS系统完整体系的介绍 销售点终端(POS机)是零售和服务行业中用于处理销售和交易的关键技术。POS系统不仅涉及支付处理,还包括库存管理、顾客关系管理、数据分析等多个方面。下面是POS系统完整体系的介绍: 1. 硬件组件 终端机&…

智能电销机器人好做吗?ai机器人有没有用?

电销机器人是基于深度神经学算法和卷积神经网络算法,将网络电话、语音识别、自然语言理解、多轮对话、知识图谱等多个门类集于一身的智能产品。不但能与客户智能交流,更能根据已经设定好的专业话术进行业务描述和问题解答,在电销行业是不可多…

leetcode数据结构与算法刷题(三)

目录 第一题 交叉链表 思想: 注意点 第一步先求两个链表的长度 第二步 让长的先走,当长短一样时一起走。 犯错点 第二题 判断是有环 思想: 注意 错误分享 第三题(重点面试题) 思路: 这题面试问题&a…

电子学会C/C++编程等级考试2022年06月(一级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:倒序输出 依次输入4个整数a、b、c、d,将他们倒序输出,即依次输出d、c、b、a这4个数。 时间限制:1000 内存限制:65536输入 一行4个整数a、b、c、d,以空格分隔。 0 < a,b,c,d < 108输出 一行4个整数d、c、b、a,整数之…

解决证书加密问题:OpenSSL与urllib3的兼容性与优化

在使用客户端证书进行加密通信时&#xff0c;用户可能会遇到一些问题。特别是当客户端证书被加密并需要密码保护时&#xff0c;OpenSSL会要求用户输入密码。这对于包含多个调用的大型会话来说并不方便&#xff0c;因为密码无法在连接的多个调用之间进行缓存和重复使用。用户希望…

飞翔的小鸟

运行游戏如下&#xff1a; 碰到柱子就结束游戏 App GameApp类 package App;import main.GameFrame;public class GameApp {public static void main(String[] args) {//游戏的入口new GameFrame();} } main Barrier 类 package main;import util.Constant; import util.Ga…

基于AVR单片机的便携式心电监测设备设计与实现

基于AVR单片机的便携式心电监测设备是一种常用的医疗设备&#xff0c;用于随时监测和记录人体的心电信号。本文将介绍便携式心电监测设备的设计原理和实现步骤&#xff0c;并提供相应的代码示例。 1. 设计概述 便携式心电监测设备是一种小巧、方便携带的设备&#xff0c;能够…

4、FFmpeg命令行操作6

图片和视频转换 截取一张图片 ffmpeg -i test.mp4 -y -f image2 -ss 00:00:02 -vframes 1 -s 640x360 test.jpg ffmpeg -i test.mp4 -y -f image2 -ss 00:00:02 -vframes 1 -s 640x360 test.bmp -i 输入 -y 覆盖 -f 格式 image2 一种格式 -ss 起始值 …

ubuntu 查看5000端口是否开放

您可以使用以下步骤来检查Ubuntu系统上的5000端口是否处于开放状态&#xff1a; 打开终端&#xff1a;在Ubuntu系统上打开终端应用程序。 使用netstat命令&#xff1a;在终端中输入以下命令&#xff0c;以查看当前活动的网络连接和监听端口&#xff1a; netstat -tuln-t 表示 …