概述:
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()) 提供的值。
语法
- 第一个参数:注入的 key
- 第二个参数:inject的默认值
使用 inject()需要注意什么?
- inject符合就近原则: Vue 会遍历父组件链,通过匹配 key 来确定所提供的值。如果父组件链上多个组件对同一个 key 提供了值,那么离得更近的组件将会“覆盖”链上更远的组件所提供的值。如果没有能通过 key 匹配到值,inject() 将返回 undefined,除非提供了一个默认值。
- 第二个参数是可选的,即在没有匹配到 key 时使用的默认值。
- 第二个参数也可以是一个工厂函数,用来返回某些创建起来比较复杂的值。
- 如果默认值本身就是一个函数,那么你必须将 false 作为第三个参数传入,表明这个函数就是默认值,而不是一个工厂函数。
- 与注册生命周期钩子的 API 类似,provide() 必须在组件的 setup() 阶段同步调用。
4. 同时使用时注意
- 用
provide&inject时, 需要使用readonly防止后代组件直接修改修改子组件- 如果真的需要修改, 则provide方法进行修改