首页 > 其他分享 >Vue——initInjections【九】

Vue——initInjections【九】

时间:2023-03-23 19:25:23浏览次数:32  
标签:__ Vue const vm result key initInjections inject

前言

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

内容

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

initInjections

initInjections的方法位于scr/core/instance/inject.ts中;

export function initInjections(vm: Component) {
  // 解析inject,返回解析后的对象
  const result = resolveInject(vm.$options.inject, vm)
  if (result) {
    // 这里是为了告诉defineReactive不需要转为为响应式数据
    // 这里也正好印证了官方文档中provide 和 inject 绑定并不是可响应的。这是刻意为之的
    toggleObserving(false)
    Object.keys(result).forEach(key => {
      /* istanbul ignore else */
      if (__DEV__) {
        defineReactive(vm, key, result[key], () => {
          warn(
            `Avoid mutating an injected value directly since the changes will be ` +
              `overwritten whenever the provided component re-renders. ` +
              `injection being mutated: "${key}"`,
            vm
          )
        })
      } else {
        defineReactive(vm, key, result[key])
      }
    })
    toggleObserving(true)
  }
}

export function resolveInject(
  inject: any,
  vm: Component
): Record<string, any> | undefined | null {
  if (inject) {
    // inject is :any because flow is not smart enough to figure out cached
    // inject 是 any类型 因为flow不够智能无法计算缓存
    // 创建一个空对象用来存放结果
    const result = Object.create(null)
    // 获取key名
    // https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Reflect/ownKeys
    // 如果支持symbol和Reflect就使用 Reflect.ownKeys来获取所有key,否则使用Object.keys
    const keys = hasSymbol ? Reflect.ownKeys(inject) : Object.keys(inject)

    for (let i = 0; i < keys.length; i++) {
      const key = keys[i]
      // #6574 in case the inject object is observed...
      // 如果是observed就跳过继续
      if (key === '__ob__') continue
      const provideKey = inject[key].from
      if (provideKey in vm._provided) {
        // 向父级_provided属性遍历查找属性值
        // 因为父级组件使用provide选项注入数据时会将注入的数据存入自身实例的_provided属性上
        result[key] = vm._provided[provideKey]
      } else if ('default' in inject[key]) {
        // 当前的数据key存在默认值即default属性
        // 需要对非原始值使用一个工厂方法可结合官方文档demo查看
        const provideDefault = inject[key].default
        result[key] = isFunction(provideDefault)
          ? provideDefault.call(vm)
          : provideDefault
      } else if (__DEV__) {
        warn(`Injection "${key as string}" not found`, vm)
      }
    }
    return result
  }
}

标签:__,Vue,const,vm,result,key,initInjections,inject
From: https://www.cnblogs.com/wangyang0210/p/17248560.html

相关文章

  • Vue 核心(一)
    目录Vue核心(一)一、Vue简介1、概述2、学前准备3、第一个程序二、模板语法三、数据绑定四、MVVM模型五、数据代理1、defineProperty2、理解数据代理3、Vue中的......
  • Vue中的this.$options.data()的this指向问题
    项目里遇到一个问题,用this.$options.data()重置组件data时报错,原因是因为form里的rule规则采用了this写法。如下:rules:{code:[this.$rules.required()],......
  • Vue3
    Vue3.0Devtools6.5.0开发者工具下载和安装1、官网地址下载:GitHub-vuejs/devtools:⚙️BrowserdevtoolsextensionfordebuggingVue.jsapplications.2、下载安装......
  • javaweb-vue快速入门
    资料来源于:B站尚硅谷JavaWeb教程(全新技术栈,全程实战),本人才疏学浅,记录笔记以供日后回顾视频链接知识点Vue前置条件:需要在项目中放入vue.js文件1){{}......
  • vue3+ts的toRef和toRefs用法
    <template><div><h2>toRefs的使用</h2><h3>姓名:{{obj.name}}</h3><h3>年龄:{{obj.age}}</h3><hr/><h3>姓名:{{name}}</h3><h3>......
  • vue3中如何通过遍历传入组件名称动态创建多个component 组件
    背景在vue3中,如果使用component,可以动态加载一个组件,例如<!--直接创建--><component:is="Image"/>这样会将已经定义好并导入的比如Image组件加载出来,但......
  • Vue之移动端viewport-vw适配
    一、前置知识vw:与视口的宽度有关,1vw就是视口宽度的1%vh:与视口的高度有关,1vh 就是视口高度的1%vmin:与当下视口的宽度和高度的最小值有关,取值为 vw 和 vh 中......
  • 从0搭建Vue3组件库(七):使用 glup 打包组件库并实现按需加载
    使用glup打包组件库并实现按需加载当我们使用Vite库模式打包的时候,vite会将样式文件全部打包到同一个文件中,这样的话我们每次都要全量引入所有样式文件做不到按需......
  • Vue-示例
    计数器<divid="counter"><button@click="subOne">-</button><span>{{num}}</span><button@click="addOne">+</button></div><scriptsrc="https://c......
  • Vue中使用 vue-i18n 进行国际化支持
    前端国际化学习前端国际化是很多地方都能用到的,今天学习一下用vue3+vite+ts+vue-i18n插件来开发前端国际化项目安装插件vue-i18nnpminstallvue-i18n......