inject和provide源码
inject和provide的使用方法,点击链接查看
在初始化时,执行了下面
callHook(vm, 'beforeCreate');
initInjections(vm); // resolve injections before data/props
initState(vm);
initProvide(vm); // resolve provide after data/props
callHook(vm, 'created');
1.initInjections 函数
function initInjections (vm) {
var result = resolveInject(vm.$options.inject, vm);
if (result) {
Object.keys(result).forEach(function (key) {
{
defineReactive$$1(vm, key, result[key], function () {警告不允许改});
}
});
}
}
2.resolveInject函数
function resolveInject (inject, vm) {
if (inject) {
var result = Object.create(null);
var keys = Reflect.ownKeys(inject)
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
if (key === '__ob__') { continue }
var provideKey = inject[key].from;
var source = vm;
while (source) {
if (source._provided && hasOwn(source._provided, provideKey)) {
result[key] = source._provided[provideKey];
break
}
source = source.$parent;
}
if (!source) {
if ('default' in inject[key]) {
var provideDefault = inject[key].default;
result[key] = typeof provideDefault === 'function'
? provideDefault.call(vm)
: provideDefault;
} else {
warn(("Injection \"" + key + "\" not found"), vm);
}
}
}
return result
}
}
1.initProvide函数
function initProvide (vm) {
var provide = vm.$options.provide;
if (provide) {
vm._provided = typeof provide === 'function'
? provide.call(vm)
: provide;
}
}