Provide和Inject的原理分析

provide和inject主要用于开发高阶插件和组件时使用。

🌰 举个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 父组件提供foo 子组件注入
//父
var Provider = {
provide:{
foo:'bar'
},
//....
}
//子
var Child = {
inject:['foo'],
created(){
console.log(this.foo);
}
}

优点:

  1. 祖先组件不需要知道哪些后代组件使用它提供的属性;
  2. 后代组件不需要知道被注入的属性来自哪里;
    缺点:
  3. 数据来源不明确
  4. 重名问题

源码分析:


组件实例初始化的时候会调用Vue.prototype._initvm._init中在data/props前面调用了initInjections,在data/props后面调用了initProvide

initInjections


该方法主要做了以下两件事:

  1. 获取vm.$options.inject,通过resolveInject方法找到对应的key集合;
  2. 遍历key集合,对其进行响应式监听;

➡️ resolveInject

该方法实现了通过$parent向上查找祖先节点数据:是通过遍历source.$parent逐级向上查找的,知道找到为止。

initProvide


该方法单纯把组件注册的provide值,赋值给vm._provided,resolveInject中有使用到

文章作者: qinwei
文章链接: https://qw-null.github.io/2022/09/15/Vue中Provide和Inject的原理分析/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 QW's Blog