Vue3 & InjectionKey 的作用、使用

前提:
1、还没用过 provide/inject 函数的同学可以先看下 provide / inject 的用法、作用
2、本文假设读者已使用过 TypeScript

1. 什么是 InjectionKey

在 Vue3 中使用 TS 时,父组件通过 provide 函数注入的数据类型往往是未知的,而子组件调用 inject 引入数据时也无法确定具体的数据类型是什么,这就产生了可维护性问题,比如某位同事写了下面这段代码时

import { inject } from "vue"
inject('Colors');

对于 colors 导数的数据类型我们并不知道是什么,它可以是对象 or 数组亦或是字符串,只能顺瓜摸藤找到它的 provide,对于小项目找一下可能不花费什么时间,但对于大型项目来说很明显是不可取的,于是官方提供了 InjectionKey 函数来对传参进行类型约束,确保父子间传递的数据类型是可见、透明的。

InjectionKey 函数的使用也很简单,原理是需将 provideinject 的第一个参数即 key 通过声明 sysmbol 的方式关联起来即可,具体使用方式看下面。

2. InjectionKey 的使用方式

// 1. 将 InjectionKey 定义的数据类型放到 keys/index.ts 下维护
// keys/index.ts
import {InjectionKey, Ref } from "vue"
// 限制了 provide 导出的数据必须是 ref 且 boolean 类型
export const showPopupKey: InjectionKey<Ref<boolean>> = Symbol()
// 限制了 provide 导出的数据必须是 string
export const titleKey: InjectionKey<string> = Symbol()

// 2. 在 A .vue 文件中调用 provide 导出数据,第一个参数则是我们上面定义好的数据类型,第二个参数是对应数据类型的值
import { provide, InjectionKey, Ref } from "vue"
import { showPopupKey } '@/keys'
const showPopup = ref(false)
// 正确
provide(showPopupKey, showPopup) 
// TS 报错: 'Hello' 是字符串,与 showPopupKey 不匹配
provide(showPopupKey, 'Hello')
// 正确
provide(titleKey, 'Hello')

// 3. 在 B.vue 文件中导入数据
import { showPopupKey } from '@/keys'
import { inject } from 'vue'
inject(showPopupKey) // 现在获取到的数据类型是安全的

有了 InjectionKey 函数后就不用再担心 provide&inject 之间的数据类型问题了,我们只需找到 InjectionKey 关联的 key 即可,
通常情况下,InjectionKey 定义的 key 数据类型都会单独放到 keys 目录维护,便于其它组件复用。

完!

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cookcyq

请作者喝杯暖暖的奶茶

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值