当前位置: 首页 > ai >正文

Vue3 + TypeScript中provide和inject的用法示例

基础写法(类型安全)

typescript

// parent.component.vue
import { provide, ref } from 'vue'
import type { InjectionKey } from 'vue'// 1. 定义类型化的 InjectionKey
const COUNTER_KEY = Symbol() as InjectionKey<number>
const USER_KEY = Symbol() as InjectionKey<{ name: string }>// 在 setup 中使用
setup() {const counter = ref(0)provide(COUNTER_KEY, counter) // 提供响应式数据const user = { name: 'John' }provide(USER_KEY, user) // 提供静态对象return { counter }
}

typescript

// child.component.vue
import { inject } from 'vue'
import type { InjectionKey } from 'vue'// 复用相同的 key
const COUNTER_KEY = Symbol() as InjectionKey<number>
const USER_KEY = Symbol() as InjectionKey<{ name: string }>setup() {// 2. 安全注入(带默认值)const counter = inject(COUNTER_KEY, ref(0)) // 响应式数据const user = inject(USER_KEY, { name: 'Guest' }) // 静态数据// 3. 强制注入(当确定父级已提供时)const forcedCounter = inject(COUNTER_KEY)!return { counter, user }
}

<script setup> 语法糖写法

vue

<!-- Parent.vue -->
<script setup lang="ts">
import { provide, ref } from 'vue'// 定义 key
const messageKey = Symbol() as InjectionKey<string>const message = ref('Hello from parent')
provide(messageKey, message)
</script>

vue

<!-- Child.vue -->
<script setup lang="ts">
import { inject } from 'vue'const messageKey = Symbol() as InjectionKey<string>// 注入 + 类型声明
const message = inject(messageKey, 'default message')// 处理可能 undefined 的情况
const safeMessage = inject(messageKey) ?? 'fallback value'
</script>

响应式对象注入

typescript

// types.ts
export interface User {id: numbername: string
}export const UserKey = Symbol() as InjectionKey<User>

vue

<!-- Parent.vue -->
<script setup lang="ts">
import { provide, reactive } from 'vue'
import { UserKey } from './types'const user = reactive({id: 1,name: 'Alice'
})provide(UserKey, user)
</script>

vue

<!-- Child.vue -->
<script setup lang="ts">
import { inject } from 'vue'
import { UserKey } from './types'const user = inject(UserKey)// 使用时需要处理可能 undefined 的情况
if (user) {console.log(user.name) // 类型安全
}
</script>

最佳实践提醒:

  1. 使用 InjectionKey:确保类型安全

  2. 默认值处理inject(key, defaultValue)

  3. 响应式数据:建议使用 ref/reactive 保持响应性

  4. 代码组织:推荐将 keys 集中管理在单独文件中

  5. 安全判断:当不确定是否已提供时,使用可选链操作符 ?.

typescript

// 推荐的文件结构
// src/provides/keys.ts
import type { InjectionKey } from 'vue'export const API_KEY = Symbol() as InjectionKey<AxiosInstance>
export const THEME_KEY = Symbol() as InjectionKey<'light' | 'dark'>
http://www.xdnf.cn/news/134.html

相关文章:

  • 【映客直播-注册/登录安全分析报告】
  • Kafka系列之:计算kafka集群topic占的存储大小
  • FairMOT与MCFairMOT算法对比
  • 智能翻译播放器,让无字幕视频不再难懂
  • 基于CNN卷积神经网络和GEI步态能量提取的视频人物步态识别算法matlab仿真
  • 基于WOA鲸鱼优化的NARMAX模型参数辨识算法MATLAB仿真,对比PSO优化算法
  • 系统架构师2025年论文写作技巧
  • 使用Pydantic优雅处理几何数据结构 - 前端输入验证实践
  • RESTful API工具和框架详解
  • (论文阅读)RNNoise 基于递归神经网络的噪声抑制库
  • 第五章 SQLite数据库:5、SQLite 进阶用法:JOIN、UNION、TRIGGER、INDEX、ALIAS、INDEXED BY 等模块
  • 2025年GitHub平台上的十大开源MCP服务器汇总分析
  • 主动防御VS自动化筛查:渗透测试与漏洞扫描的深度攻防指南
  • 【Easylive】微服务架构在系统中的优缺点的具体体现
  • Linux之基础命令
  • 文件上传漏洞
  • 【Linux】进程概念(二):PCB,ps 和 fork
  • 《AI大模型应知应会100篇》第25篇:Few-shot与Zero-shot使用方法对比
  • 残差连接缓解梯度消失的含义;残差连接的真正含义:F(x) = y - x ;y=F(x)+x
  • vue3 nprogress 使用
  • 4月18日星期五今日早报简报微语报早读
  • 从PDF到播客:MIT开发的超越NotebookLM的工具
  • Python项目调用Java数据接口实现CRUD操作
  • 游戏一:俄罗斯方块简易版
  • 关于yarn和hadoop
  • Java学习手册:Java并发编程最佳实践
  • Spring Boot 3 + SpringDoc:打造接口文档
  • docker.desktop下安装普罗米修斯prometheus、grafana并看服务器信息
  • PHP腾讯云人脸核身获取NONCE ticket
  • 系统架构设计师:流水线技术相关知识点、记忆卡片、多同类型练习题、答案与解析