news 2026/10/30 8:37:59

Vue 3 响应式系统类型关系总结

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue 3 响应式系统类型关系总结

Vue3提供了多种创建响应式数据的方式,主要包括

  • reactive()(返回代理对象,适用于复杂数据结构)
  • ref()(返回Ref对象,包装原始值)
  • computed()(返回计算属性Ref)

不同类型具有不同的响应式特点:reactive实现深度响应,ref需要.value访问,computed具有惰性求值特性。


此外还有readonly、shallow系列等变体,分别适用于只读、浅层响应等场景。


类型判断可使用isRef/isReactive工具函数。


开发者应根据具体需求(处理原始值/对象、性能优化、只读需求等)选择合适的响应式API。


Vue 3 响应式系统类型关系总结

类别核心API返回类型响应性特点适用场景注意事项
响应式对象reactive()T(代理对象)深度响应式,嵌套属性自动响应对象、数组、Set、Map等复杂数据结构1. 仅适用于对象类型
2. 不能用于原始值
3. 解构会丢失响应性
响应式原始值ref()Ref<T>包装原始值为响应式对象,通过.value访问原始值(string、number、boolean等)、对象引用1. 需通过.value访问/修改值
2. 模板中自动解包
计算属性computed()ComputedRef<T>惰性求值,缓存结果,依赖变化时重新计算派生状态、复杂计算逻辑1. 避免副作用
2. 结果只读(除非提供setter)
只读响应式readonly()Readonly<T>创建只读代理,防止意外修改传递响应式对象但不允许修改的场景1. 嵌套属性也是只读的
2. 深层只读
浅层响应式shallowRef()ShallowRef<T>仅.value本身响应式,嵌套对象不处理大型对象或与第三方库集成1. 替换整个.value会触发响应
2. 修改嵌套属性不会
浅层响应式对象shallowReactive()T仅根级别属性响应式,嵌套对象保持原样性能敏感场景,明确知道哪些属性需要响应仅跟踪根级别属性的访问/修改
浅层只读shallowReadonly()Readonly<T>根级别只读,嵌套对象可修改需要部分保护的情况允许修改深层嵌套属性
响应式转换toRef()Ref<T>为响应式对象的属性创建单独ref提取props的属性保持响应性保持与源属性的响应式连接
响应式转换(多个)toRefs(){ [K in keyof T]: Ref<T[K]> }将响应式对象转为普通对象,属性均为ref解构reactive对象时保持响应性便于解构而不丢失响应性
原始值转换toRaw()T返回reactive或readonly的原始对象需要操作非代理对象时(如第三方库)绕过响应式系统,修改不会触发更新
标记响应式markRaw()T标记对象永不转换为响应式第三方类实例、大型不可变数据Vue会跳过对该对象的代理

类型关系图

text

原始数据 ├── reactive() → 响应式代理 (深度) │ ├── readonly() → 只读代理 │ └── toRefs() → 解构用ref集合 ├── ref() → Ref对象 (包装值) │ ├── shallowRef() → 浅层Ref │ └── computed() → 计算Ref ├── shallowReactive() → 浅层代理 │ └── shallowReadonly() → 浅层只读代理 └── markRaw() → 非响应式标记

选择指南

  1. 使用reactive当处理对象/集合且需要深度响应

  2. 使用ref当处理原始值或需要替换整个对象引用

  3. 使用computed当值依赖其他响应式数据

  4. 使用readonly当需要防止意外修改

  5. 使用shallow*系列优化性能或集成外部库

  6. 使用toRefs当需要解构reactive对象


TypeScript 类型关系示例

// 基本类型关系 type Reactive<T> = T extends object ? T : never type Ref<T> = { value: T } type ComputedRef<T> = Readonly<Ref<T>> // 实际使用 const state = reactive({ count: 0 }) // Reactive<{ count: number }> const count = ref(0) // Ref<number> const doubled = computed(() => count.value * 2) // ComputedRef<number>

这个总结涵盖了Vue 3响应式系统的主要API及其类型关系,帮助开发者根据具体场景选择合适的响应式工具。


在 Vue 3 中,响应式值的类型不一定是Ref,但使用ref()创建的响应式变量确实是Ref<T>类型。


Vue 3 提供了多种创建响应式数据的方式,每种方式对应不同的类型:


1.ref()→ 类型是Ref<T>

用于创建基本类型(如number、string、boolean)或普通对象的响应式引用。

import { ref } from 'vue' const count = ref(0) // Ref<number> const name = ref('Alice') // Ref<string> const obj = ref({ a: 1 }) // Ref<{ a: number }>
  • 访问/修改需要.value:
    console.log(count.value) // 0 count.value++ // 修改

2.reactive()→ 类型是原始对象的代理(Proxy),不是Ref

用于创建对象或数组的深层响应式副本。

import { reactive } from 'vue' const state = reactive({ count: 0, name: 'Alice' }) // { count: number; name: string }
  • 直接访问属性,不需要.value:
    console.log(state.count) // 0 state.count++ // 修改

⚠️ 注意:reactive()返回的是一个 Proxy 对象,其 TypeScript 类型就是你传入对象的类型(如{ count: number }),不是Ref。


3.shallowRef()/shallowReactive()→ 浅层响应式

  • shallowRef<T>()→Ref<T>(但只对.value本身响应,内部对象属性非响应式)
  • shallowReactive<T>(obj)→T(只对顶层属性响应)

4. 在<script setup>中配合defineModel、props等

  • props是reactive对象(不可变,类型为Readonly<...>)
  • defineModel()返回的是Ref

如何判断一个值是不是Ref?

使用 Vue 提供的工具函数:

import { isRef, isReactive } from 'vue' isRef(count) // true(如果是 ref 创建的) isReactive(state) // true(如果是 reactive 创建的)

总结

创建方式返回类型是否需要.value适用场景
ref(value)Ref<T>✅ 是基本类型、单个值
reactive(obj)T(Proxy 代理的对象)❌ 否对象、数组等复杂结构
shallowRef()Ref<T>(浅层)✅ 是大型对象性能优化
shallowReactive()T(浅层 Proxy)❌ 否仅需顶层响应式

所以:只有通过ref()(及其变体如computed、shallowRef)创建的响应式变量才是Ref类型;而reactive()创建的是普通对象类型的响应式代理,不是Ref。


补充:computed也是Ref

import { computed } from 'vue' const doubled = computed(() => count.value * 2) // ComputedRef<number>(是 Ref 的子类型)

computed返回的是ComputedRef<T>,它继承自Ref<T>,所以也可以用.value访问,并且isRef(doubled)为true。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/27 8:52:25

从Demo到生产:M2FP支持高并发请求的压力测试方案

从Demo到生产&#xff1a;M2FP支持高并发请求的压力测试方案 &#x1f4cc; 背景与挑战&#xff1a;从单机Demo迈向生产级服务 随着AI视觉应用在虚拟试衣、动作分析、智能安防等场景的深入落地&#xff0c;多人人体解析&#xff08;Multi-person Human Parsing&#xff09;作为…

作者头像 李华
网站建设 2026/10/28 23:17:11

Z-Image-Turbo壁纸工厂:手机/电脑双端适配图像生成

Z-Image-Turbo壁纸工厂&#xff1a;手机/电脑双端适配图像生成 阿里通义Z-Image-Turbo WebUI图像快速生成模型 二次开发构建by科哥核心价值&#xff1a;基于阿里通义实验室发布的Z-Image-Turbo模型&#xff0c;由开发者“科哥”进行深度二次开发&#xff0c;打造了一套专为桌面…

作者头像 李华
网站建设 2026/10/27 8:51:59

Z-Image-Turbo建筑风格迁移:中式、欧式、现代风实现

Z-Image-Turbo建筑风格迁移&#xff1a;中式、欧式、现代风实现 引言&#xff1a;AI图像生成在建筑设计中的新范式 随着生成式AI技术的快速发展&#xff0c;建筑设计领域正迎来一场视觉创作的革命。阿里通义推出的Z-Image-Turbo WebUI作为一款高效图像生成模型&#xff0c;凭…

作者头像 李华
网站建设 2026/10/27 8:52:05

救命神器8个AI论文软件,专科生搞定毕业论文+格式规范!

救命神器8个AI论文软件&#xff0c;专科生搞定毕业论文格式规范&#xff01; AI 工具助力论文写作&#xff0c;专科生也能轻松应对 在如今的学术环境中&#xff0c;论文写作已成为专科生毕业路上的一道重要关卡。面对复杂的格式要求、繁重的内容撰写任务&#xff0c;许多同学感…

作者头像 李华
网站建设 2026/10/27 9:15:49

聊一聊大模型幻觉问题及其解决方案

01 什么是大模型幻觉问题 **1.**什么是大模型幻觉 首先介绍一下什么是大模型的幻觉。在某些情况下&#xff0c;我们在使用大模型生成结果时&#xff0c;会有一个直观的感受&#xff0c;就是“一本正经的胡说八道”。 一本正经&#xff1a;生成结果流畅、困惑度 PPL 低、有逻辑性…

作者头像 李华
网站建设 2026/10/26 21:52:36

电商直播AI助手:集成M2FP实现主播服装智能标签化

电商直播AI助手&#xff1a;集成M2FP实现主播服装智能标签化 在电商直播场景中&#xff0c;商品信息的自动化标注是提升运营效率的关键环节。尤其对于服饰类目&#xff0c;主播所穿服装的实时识别与打标&#xff0c;能够显著加速商品上架、推荐匹配和用户搜索流程。然而&#…

作者头像 李华