【Vue.js】Composition API - provide() 和 inject()

129 阅读2分钟

概述:

provide() & inject() 是一种组件的非标准解决方案,主要用来解决 :

  • props深层传值
  • 发送自定义深层事件(deep emit)

provide()

传递参数:

provide() 接受两个参数:

  • 第一个参数:要注入的 key,可以是一个字符串或者一个 symbol
  • 第二个参数:是要注入的值。

结合TypeScript使用:

当使用 TypeScript 时,key 可以是一个被类型断言为 InjectionKey 的 symbol。InjectionKey 是一个 Vue 提供的工具类型,继承自 Symbol,可以用来同步 provide() 和 inject() 之间值的类型。

使用 provide() 需要注意什么?

  • 与注册生命周期钩子的 API 类似,provide() 必须在组件的 setup() 阶段同步调用。

inject()

作用

  • 注入一个由祖先组件或整个应用 (通过 app.provide()) 提供的值。

语法

  1. 第一个参数:注入的 key
  2. 第二个参数:inject的默认值

使用 inject()需要注意什么?

  • inject符合就近原则: Vue 会遍历父组件链,通过匹配 key 来确定所提供的值。如果父组件链上多个组件对同一个 key 提供了值,那么离得更近的组件将会“覆盖”链上更远的组件所提供的值。如果没有能通过 key 匹配到值,inject() 将返回 undefined,除非提供了一个默认值。
  • 第二个参数是可选的,即在没有匹配到 key 时使用的默认值。
  • 第二个参数也可以是一个工厂函数,用来返回某些创建起来比较复杂的值。
  • 如果默认值本身就是一个函数,那么你必须将 false 作为第三个参数传入,表明这个函数就是默认值,而不是一个工厂函数。
  • 与注册生命周期钩子的 API 类似,provide() 必须在组件的 setup() 阶段同步调用。

4. 同时使用时注意

  • provide & inject 时, 需要使用 readonly 防止后代组件直接修改修改子组件
  • 如果真的需要修改, 则provide方法进行修改