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

news2024/11/16 11:38:49

依赖注入

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

特点:

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

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

在这里插入图片描述

/**
 * provide 的实现
 */
function provide(key, value) {
  let provides = currentInstance.provides // 当前实例的 provides
  const 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 || currentRenderingInstance
  if (instance) {
    const provides = instance.provides
    // 存在 key,则返回对应的 value
    if (key in provides) {
      return provides[key]
    }
    // 不存在 key,则返回默认值 defaultValue
    else if (arguments.length > 1) {
      return defaultValue
    }
    // 如果都不成立,则在非生产环境报警告
    else if ((process.env.NODE_ENV !== 'production')) {
      warn(/* ... */)
    }
  }
}

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

  1. 作用域不同

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

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

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

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

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

相关文章

量子计算+物流!“最后一英里”配送难题Unisys成功实时决策

(图片来源:网络) 此前,供应链行业一直致力于手工操作,严重依赖于纸质系统。后来随着客户需求的不断变化,这种传统方法逐渐显出不足之处。供应链行业正在迅速转向现代化,采用自动化和数据驱动的…

【开源】基于微信小程序的音乐平台

项目编号: S 055 ,文末获取源码。 \color{red}{项目编号:S055,文末获取源码。} 项目编号:S055,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示 四、核心代码4.1 查询单首…

redis的一些操作

文章目录 清空当前缓存和所有缓存配置内存大小,防止内存饱满设置内存淘汰策略键过期机制 清空当前缓存和所有缓存 Windows环境下使用命令行进行redis缓存清理 redis安装目录下输入cmdredis-cli -p 端口号flushdb 清除当前数据库缓存flushall 清除整个redis所有缓存…

关于一些网络的概述

语义分割网络是一种基于深度学习的计算机视觉技术,它能够将图像中的每个像素分配给特定的类别,从而实现对图像中不同对象的精确识别和定位。近年来,随着深度学习技术的不断发展,语义分割网络在各个领域都取得了显著的进展。 早期的语义分割网络主要采用全卷积神经网络(FC…

大数据分析仓库Kylin

一、Kylin 定义 Apache Kylin 是一个开源的分布式分析引擎,提供 Hadoop/Spark 之上的 SQL 查询接口及多维分析能力以支持超大规模数据,最初由 eBay 开发并贡献至开源社区。它能在亚秒内查询巨大的 Hive 表。 二、Kylin 架构 A、REST Server 是应用程序…

操作系统基础操作

操作系统的启动 体系结构概念 CPU、I/O、内存-通过总线连接 操作系统一开始存放时没有放在内存里,而是当在DISK中,由BIOS提供相应支持 DISK:存放OSBIOS:基本I/O处理系统(计算机开机时可以让系统检测各种外设&#…

软文转化率如何提高,媒介盒子分享三大原则

决定软文推广的主要因素就在于软文内容,但是如何才能提高软文转化率呢?下面就让媒介盒子为你解答! 一、 软文类型 软文类型按照推广目标划分主要分为品牌软文、产品软文、营销软文。 ● 品牌软文 品牌软文的目的在于扩大品牌对群众的影响力…

基于Vue+SpringBoot的桃花峪滑雪场租赁系统

项目编号: S 036 ,文末获取源码。 \color{red}{项目编号:S036,文末获取源码。} 项目编号:S036,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 游客服务2.2 雪场管理 三、数据库设…

SpringCloud微服务 【实用篇】| Eureka注册中心、Ribbon负载均衡

目录 一:Eureka注册中心 1. Eureka原理 2. 动手实践 ①搭建EurekaServer ②服务注册 ③服务发现 二:Ribbon负载均衡 1. 负载均衡原理 2. 负载均衡策略 3. 懒加载 一:Eureka注册中心 前面已经分析了,无论是SpringCloud还…

从0开始学习JavaScript--JavaScript中的集合类

JavaScript中的集合类是处理数据的关键,涵盖了数组、Set、Map等多种数据结构。本文将深入研究这些集合类的创建、操作,以及实际应用场景,并通过丰富的示例代码,帮助大家更全面地了解和应用这些概念。 数组(Array&…

【Java】NIO概述

本文主要介绍Java的IO。 这里主要按类的操作方式和操作对象对JavaIO进行分类,方便理解,后续使用时可以方便地查询。 一、操作方式分类 首先介绍几组概念: 字节流和字符流: 字节流:以字节为单位,每次次读…

【高级网络程序设计】Week2-3 HTML

一、The Basics 1. HTML&HTML file HTMLMarkup languageHyper Text Markup LanguageHTML fileText file with markup tags.htm/.html extension Create an html file Open an editor Type: <html><head><titile><body> Save it as .html Open i…

计算机网络——网络可靠性及网络出口配置

1. 前言&#xff1a; 学习目标&#xff1a; 1.了解链路聚合的作用 2. 了解ACL的工作原理 3. 了解NAT的工作原理和配置 2. 网络可靠性方案 网络可靠性是指网络在面对各种异常情况或故障时&#xff0c;能够维持正常运行和提供服务的能力。这包括防止网络中断、减小数据丢失的可能…

vue3中使用全局自定义指令和组件自定义指令

这篇文章会教大家如何实现全局自定义指令和组件自定义指令 &#x1f4d3;全局自定义指令和组件自定义指令的区别&#xff0c;除了写法不同和作用不同&#xff0c;其他的包括生命周期的使用方法都是一致的&#xff0c;全局自定义指令在main.ts中注册后整个项目都可以使用&#x…

dvwa-command injection 代码审计(超详细逐行审计)

dvwa-command injection 代码审计 low <?phpif( isset( $_POST[ Submit ] ) ) {// Get input$target $_REQUEST[ ip ];// Determine OS and execute the ping command.if( stristr( php_uname( s ), Windows NT ) ) {// Windows$cmd shell_exec( ping . $target );}…

Parallel Diffusion Models of Operator and Image for Blind Inverse Problems

盲逆问题算子和图像的并行扩散模型 论文链接&#xff1a;https://arxiv.org/abs/2211.10656 项目链接&#xff1a;https://github.com/BlindDPS/blind-dps Abstract 在正向算子已知的情况下(即非盲)&#xff0c;基于扩散模型的逆问题求解器已经展示了最先进的性能。然而&…

linux md5sum计算hash指令

在soc启动&#xff0c;验证镜像签名时&#xff0c;会计算文件的hash值&#xff0c;确保文件未被修改&#xff0c;md5sum可以计算&#xff0c;有256,512位的的其他指令&#xff0c; 如下&#xff0c;计算文件hash值。

@PostConstruct虽好,请勿乱用

1.问题说明 在日常的业务开发中&#xff0c;有时会利用PostConstruct在容器启动时执行一些任务。例如&#xff1a; PostConstruct public void init(){System.out.println("service 初始化..............."); }一般情况这没什么问题&#xff0c;但最近一个同事在做…

Android加固为何重要?很多人不学

为什么要加固&#xff1f; APP加固是对APP代码逻辑的一种保护。原理是将应用文件进行某种形式的转换&#xff0c;包括不限于隐藏&#xff0c;混淆&#xff0c;加密等操作&#xff0c;进一步保护软件的利益不受损坏。总结主要有以下三方面预期效果&#xff1a; 1.防篡改&#x…

django restful framework序列化与反序列化

在前后端分离开发中&#xff0c;对于RESTfulAPI设置&#xff0c;一般需要将查询/更新数据以JSON方式进行返回。 序列化 Model.py from django.db import models class User(models.Model):username models.CharField(verbose_name用户名,max_length10)age models.IntegerF…