首页IT科技vue里this指向(Vue——initInjections【九】)

vue里this指向(Vue——initInjections【九】)

时间2025-05-05 03:30:27分类IT科技浏览3339
导读:前言 前面我们简单的了解了 vue 初始化时的一些大概的流程,这里我们详细的了解下具体的内容;...

前言

前面我们简单的了解了 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 } }

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
宽带连接错误791(宽带错误797怎么解决?)