Skip to content

依赖注入 (provide/inject)

用法

TIP

用法详见Vue文档

WARNING

这个API只能在组件内部使用

原理

provide

组件初始化时, 会取到父组件实例上的provides对象并放到当前组件上

typescript
provides: parentComponent ? parentComponent.provides : Object.create(null) // 储存依赖注入的值

调用provide时会把新增的属性放在当前组件的provides上

typescript
export function provide(key, value) {
  // 子用的是父 子提供了属性
  // 子提供的新属性应该和父亲没关系

  if (!currentInstance)
    return // 建立在组件基础上的
  const parentProvide = currentInstance.parent?.provides

  let provides = currentInstance.provides

  if (parentProvide === provides) {
    // 如果在子组件上新增了provides要拷贝一份全新的
    provides = currentInstance.provides = Object.create(provides)
  }

  provides[key] = value
}

inject

调用inject时会从当前组件的provides中取值 如果没有找到, 就返回传入的默认值

typescript
export function inject(key, defaultValue?) {
  if (!currentInstance)
    return
  const provides = currentInstance.parent?.provides

  if (provides && key in provides) {
    return provides[key] // 从provide中取出来使用
  }
  else {
    return defaultValue // 默认值
  }
}