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

vue原理分析(十四)研究new Vue()中的 initProvide

在Vue.prototype._init 中有一些init函数,今天我们来研究这些init函数

Vue.prototype._init = function (options) {......{initProxy(vm);}......initLifecycle(vm);initEvents(vm);initRender(vm);callHook$1(vm, 'beforeCreate', undefined, false /* setContext */);initInjections(vm); // resolve injections before data/propsinitState(vm);initProvide(vm); // resolve provide after data/propscallHook$1(vm, 'created');......
}


上一篇中已经研究了 initState ,今天我们往下研究

initProvide(vm);
function initProvide(vm) {const provideOption = vm.$options.provide;if (provideOption) {// 获取provided的对象const provided = isFunction(provideOption)? provideOption.call(vm): provideOption;// 如过不是object对象且为null直接返回if (!isObject(provided)) {return;}// 解析provideconst source = resolveProvided(vm);// IE9 doesn't support Object.getOwnPropertyDescriptors so we have to// iterate the keys ourselves.// IE9不支持Object.getOwnPropertyDescriptors所以这里必须自己去迭代keysconst keys = hasSymbol ? Reflect.ownKeys(provided) : Object.keys(provided);for (let i = 0; i < keys.length; i++) {const key = keys[i];Object.defineProperty(source, key, Object.getOwnPropertyDescriptor(provided, key));}}
}
function resolveProvided(vm) {// by default an instance inherits its parent's provides object// but when it needs to provide values of its own, it creates its// own provides object using parent provides object as prototype.// this way in `inject` we can simply look up injections from direct// parent and let the prototype chain do the work.// 默认情况下,实例继承其父级的provides对象,// 但当它需要提供自己的值时,// 它会使用父级provides对象作为原型创建自己的provide对象。// 通过这种方式,在“inject”中,我们可以简单地从直接父级查找注入,并让原型链来完成工作。// existing 是 实例上的 _providedconst existing = vm._provided;const parentProvides = vm.$parent && vm.$parent._provided;// 如果父级上的_provided和实例上的_provided一致,就将父级上的parentProvides赋给实例上的_provided// 否则直接返回实例上的属性if (parentProvides === existing) {return (vm._provided = Object.create(parentProvides));}else {return existing;}
}

http://www.lryc.cn/news/437377.html

相关文章:

  • Qt控制开发板的LED
  • S3C2440开发板点亮LED灯+PWM定时器
  • S-Procedure的基本形式及使用
  • free -h 查看内存free空间不足
  • rust学习笔记
  • 【有啥问啥】复习变分下界即证据下界(Evidence Lower Bound, ELBO):原理与应用
  • Linux shell编程学习笔记78:cpio命令——文件和目录归档工具(上)
  • 为什么在 JSON 序列化中不使用 transient
  • K8S - Volume - NFS 卷的简介和使用
  • IO模型---BIO、NIO、IO多路复用、AIO详解
  • 蓝桥杯真题——约翰的牛奶
  • 单机docker-compose部署minio
  • Winform实现弹出定时框功能
  • 【机器学习(四)】分类和回归任务-梯度提升决策树(GBDT)-Sentosa_DSML社区版
  • Mini-Omni 语言模型在流式传输中边思考边听说应用
  • vue devtools的使用
  • 无人机培训:无人机维护保养技术详解
  • Mac 创建 Python 虚拟环境
  • 安卓玩机工具-----无需root权限 卸载 禁用 删除当前机型app应用 ADB玩机工具
  • 中国科技统计年鉴1991-2020年
  • OpenAI / GPT-4o:Python 返回结构化 / JSON 输出
  • 通信工程学习:什么是EDFA掺铒光纤放大器
  • 机器学习与深度学习的区别
  • 标准库标头 <barrier>(C++20)学习
  • 如何测量一个(传输网络)系统的容量
  • 【MySQL】MySQL和Workbench版本兼容问题
  • 项目实战 ---- 商用落地视频搜索系统(10)---后台搜索Cache优化
  • 客户端(服务器下载文件)
  • P1544 三倍经验 (记忆化搜索)
  • 【在Python中创建简单界面计算器】