首页 > 其他分享 >Vue——initProvide【十一】

Vue——initProvide【十一】

时间:2023-03-28 19:58:25浏览次数:47  
标签:十一 Vue const initProvide provided keys provideOption Object vm

前言

前面我们简单的了解了 vue 初始化时的一些大概的流程,这里我们详细的了解下具体的内容;

内容

这一块主要围绕init.ts中的initProvide进行剖析,初始化生命周期之后紧接着。

initProvide

export function initProvide(vm: Component) {
  const provideOption = vm.$options.provide
  if (provideOption) {
    // 获取provided的对象
    const provided = isFunction(provideOption)
      ? provideOption.call(vm)
      : provideOption

    // 如过不是object对象且为null直接返回
    if (!isObject(provided)) {
      return
    }
    // 解析provide
    const source = resolveProvided(vm)
    // IE9 doesn't support Object.getOwnPropertyDescriptors so we have to
    // iterate the keys ourselves.

    const keys = hasSymbol ? Reflect.ownKeys(provided) : Object.keys(provided)
    // IE9不支持Object.getOwnPropertyDescriptors所以这里必须自己去迭代keys
    for (let i = 0; i < keys.length; i++) {
      const key = keys[i]
      Object.defineProperty(
        source,
        key,
        Object.getOwnPropertyDescriptor(provided, key)! // https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptor
      )
    }
  }
}

resolveProvided

resolveProvided位于src/v3/apilnject.ts

export function resolveProvided(vm: Component): Record<string, any> {
  // 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”中,我们可以简单地从直接父级查找注入,并让原型链来完成工作。
  const 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
  }
}

标签:十一,Vue,const,initProvide,provided,keys,provideOption,Object,vm
From: https://www.cnblogs.com/wangyang0210/p/17266458.html

相关文章

  • vue 软键盘组件封装
    场景和需求1软键盘固定2多输入框共用一个组件,聚焦切换时操作对象自动切换3根据光标在输入框的位置进行相应的输入和删除操作4点击软键盘时保存输入框光标活跃5输......
  • 记录--vue刷新当前页面
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助背景项目当中如果做新增/修改/删除等等操作通常情况下都需要刷新数据或者刷新当前页面.思路(1)如果......
  • vue-cookies用法
    importCookiesfrom'vue-cookies';constcookies={};cookies.set=function(name='default',value='',cookieSetting=60*60*24*365){Co......
  • vue全家桶进阶之路23:Element UI
    ElementUI是一套基于Vue.js的组件库,它提供了一系列常用的UI组件,包括表单、弹窗、布局、导航等等。ElementUI的设计风格简洁、易用、美观,且易于定制。ElementUI......
  • Spring boot 、Vue学习体会
    近期集中学习了Springboot、Vue等技术,学习过程也是不断碰壁,总的来说自认为有些涨进,抓住核心、深入关键、逐步剖析。两个技术分别负责后台和前端,学习后一个感受,两个技术......
  • Vue子组件向父组件传值(this.$emit()方法)
    子组件使用this.$emit()向父组件传值首先必须在父组件中引用子组件,然后实现传值第一步在父组件中引入子组件 importUnitByPurchaseAddOrUpdatefrom'@views/module......
  • vue图片上传前压缩图片
    前言需求:项目当中上传图片的需求点肯定有很多,再上传之后,如果图片很大的话,在加载的时候就会很慢。最近发现系统首次加载越来越慢,就开始思考怎么能降低这个加载时间,由于首页......
  • 第七章 工程化 - 实例体验 - 基于 vue框架 开发一个完整的组件库 一
    基于vue框架开发一个完整的组件库来体验前端工程化的魅力对一个组件库的开发来全面认识熟悉前端工程化的配置,系统的理解工程化中各个工具所起到的作用,并且将其最终可......
  • 第八章 工程化 - 实例体验 - 基于 vue框架 开发一个完整的组件库 二
    基础Monorepo环境建设包名选择与注册1、给组件库命名=>最终会发布到npm.js仓库2、查看组件库的命名是否可注册方法npmviewpackage-nameversion如......
  • vue全家桶进阶之路22:Vue CLI脚手架
    VueCLI是一个基于Vue.js的官方脚手架工具,它可以帮助我们快速创建和管理Vue.js项目,提供了一些工具和配置来帮助我们开发和调试Vue.js应用。一切框架都是为了将开发......