# Vue provide/inject

# provide/inject 方法

深层次组件通信方法 API (opens new window) src (opens new window)

export function initInjections (vm: Component) {
  // 从组件选项中获取 provide, inject值
  const provide = vm.$options.provide
  const inject: any = vm.$options.inject

  // 注册provide, 将provide的值挂载到当前实例私有属性上
  if (provide) {
    // provide的值为对象或函数的情形,最终还是使用对象
    vm._provided = typeof provide === 'function'
      ? provide.call(vm)
      : provide
  }

  // 注册Inject
  if (inject) {
    const isArray = Array.isArray(inject)

    // inject 的值为数组和对象的两种情况
    const keys = isArray
      ? inject
      : hasSymbol
        ? Reflect.ownKeys(inject)
        : Object.keys(inject)

    for (let i = 0; i < keys.length; i++) {
      const key = keys[i]

      // 获取需要注册的key值
      const provideKey = isArray ? key : inject[key]
      let source = vm

      // 遍历组件实例,获取provide值
      while (source) {
        if (source._provided && source._provided[provideKey]) {

          // 获取到后挂载到当前实例上
          vm[key] = source._provided[provideKey]
          break
        }
        // 不断往上级父组件进行查找
        source = source.$parent
      }
    }
  }
}
上次更新于: 9/2/2021, 1:44:36 AM