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

Vue3源码runtime-core运行时核心模块之provide依赖和inject注入详解

概览

vue3中提供了一种父子组件(也包括爷孙组件)的通信方式,即依赖provide和注入inject。父子组件固然可以通过属性以及emit实现数据交换,但是有一个弊端就是,只能逐层传递,而provide/inject只要是存在组件嵌套关系,父子关系的延续,就可以应用。

源码分析

provideinject是是直接可以从vue3中导入使用的方法,实现文件路径:packages\runtime-core\src\apiInject.ts

provide

provide方法就是往实例instanceprovides属性中新增键值对。

provide的源码实现如下:

function provide(key, value) {if (!currentInstance) ; else {let provides = currentInstance.provides;const parentProvides = currentInstance.parent && currentInstance.parent.provides;if (parentProvides === provides) {provides = currentInstance.provides = Object.create(parentProvides);}provides[key] = value;}
}

provide方法接收键值对keyvalue;若是当前实例currentInstance不存在,则直接return;前面提到数据都是挂载到实例上。然后获取实例的provides,获取当前实例的父实例上的provides,然后判断parentProvidesprovides是否相等,若相等,则说明二者都是null,然后通过Object.create创建一个纯净的对象;最后就是赋值。

在vue3的源码createComponentInstance即创建组件实例中,也是先判断parent.provides,若存在,则将父组件的provides赋值给当前实例的provides;若不存在则通过Object.create创建。

function createComponentInstance(vnode, parent, suspense){const appContext = (parent ? parent.appContext : vnode.appContext) || emptyAppContext;const instance = {provides: parent ? parent.provides : Object.create(appContext.provides),}return instance;
}

inject

inject方法就是从provides中提供的数据获取key对应值,因为父子组件实例的provides是一条原型链,若父组件中不存在,则会继续查找父组件的父组件上是否存在。其实现如下:

function inject(key, defaultValue, treatDefaultAsFactory = false) {const instance = getCurrentInstance();if (instance || currentApp) {let provides = currentApp ? currentApp._context.provides : instance ? instance.parent == null || instance.ce ? instance.vnode.appContext && instance.vnode.appContext.provides : instance.parent.provides : void 0;if (provides && key in provides) {return provides[key];} else if (arguments.length > 1) {return treatDefaultAsFactory && shared.isFunction(defaultValue) ? defaultValue.call(instance && instance.proxy) : defaultValue;} else ;}
}

inject方法接收三个参数:key键/defaultValue默认值/treatDefaultAsFactory是否作为工厂函数。先是调用getCurrentInstance()获取当前的组件实例,然后判断组件实例或应用实例是否存在,若存在,则通过一些三元操作来获取provides,然后获取对应的值;若provides中不存在key属性,且参数超过1个,则判断默认值是否是函数以及是否是工厂模式,若是,则调用该函数,this为组件实例的代理对象;否则返回默认值。

http://www.dtcms.com/a/461871.html

相关文章:

  • 网站开发个人简历word下载陕西网站建设设计
  • P2P技术
  • 面试真实经历某节跳动大厂Java和算法问答以及答案总结(一)
  • Python全栈(基础篇)——Day08:后端内容(切片+迭代+实战演示+每日一题)
  • 各大网站头条凡科免费网站可以做推广吗
  • 技术速递|GitHub 如何保护开发者免受版权执法过度影响
  • LLAVA-MINI论文阅读
  • OpenAI Agents 并行化实现
  • CNN卷计计算
  • 腾讯云服务器做网站可以吗徐州网站建设
  • 上市公司协会网站建设汇报wordpress接入qq互联
  • 前端 = [...this.orderList] (深拷贝)和this.orderList (引用赋值)
  • 部门管理|“删除部门”功能实现(Django5零基础Web平台)
  • 从 0 到 1 搭建 Python 语言 Web UI自动化测试学习系列 12--日志模块设计
  • 服务器网站源码在哪七牛云配置wordpress
  • SQL-多对多关系
  • PostgreSQL 18 异步 I/O(AIO)调优指南
  • 购物网站名字大全云虚拟主机 多个网站
  • 使用DuckDB SQL求三阶六角幻方
  • 电子商务网站建设一般流程无忧代理 在线
  • 一文了解Function Calling、MCP、Agent联系与区别
  • 存储芯片核心产业链主营产品:兆易创新、北京君正、澜起科技、江波龙、长电科技、佰维存储,6家龙头公司主营产品深度数据
  • Git 常用命令完整指南
  • 网站维护入口房子装修设计软件
  • MySQL 延时从库的作用与意义
  • h5网站价格wordpress footer.php添加qq悬浮
  • 【脚本升级】银河麒麟V10一键安装MySQL9.3.0
  • android pdf框架-15,mupdf工具与其它
  • 前端通用文件下载方案:从 Blob 流处理到实际业务落地
  • 箭头函数的this指向问题