news 2026/4/29 20:49:26

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>

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

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>中配合defineModelprops

  • propsreactive对象(不可变,类型为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()(及其变体如computedshallowRef)创建的响应式变量才是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/4/23 17:47:36

STM32F407系列工控板源程序:支持以太网、FX3U PLC,版本多样,已修复多项bug

STM32F407/以太网/FX3U/PLC/工控板源程序 支持stm32f407/429/405芯片 支持断电数据保存。 目前源码有两个版本 图1.是Hal库版本已经被个别人进行倒卖。 现在已经进行了多项bug修复。 图2.是标准的库函数版本不进行网上交易&#xff0c;需要当面交易。最近在工控圈子里看到几个老…

作者头像 李华
网站建设 2026/4/21 21:42:17

Z-Image-Turbo ModelScope模型下载速度优化

Z-Image-Turbo ModelScope模型下载速度优化 阿里通义Z-Image-Turbo WebUI图像快速生成模型 二次开发构建by科哥 运行截图 在AI图像生成领域&#xff0c;模型加载效率直接影响用户体验和生产环境部署成本。阿里通义推出的Z-Image-Turbo作为一款高性能、低延迟的文生图模型&…

作者头像 李华
网站建设 2026/4/25 19:58:03

Z-Image-Turbo微博热搜话题图快速制作流程

Z-Image-Turbo微博热搜话题图快速制作流程 阿里通义Z-Image-Turbo WebUI图像快速生成模型 二次开发构建by科哥 在社交媒体内容创作中&#xff0c;视觉冲击力决定传播效率。微博热搜话题图作为信息引爆点&#xff0c;需要兼具高辨识度、强情绪引导和精准主题表达。传统设计流程…

作者头像 李华
网站建设 2026/4/20 15:15:35

Z-Image-Turbo医疗健康科普插图生成实践

Z-Image-Turbo医疗健康科普插图生成实践 项目背景与技术选型动因 在医疗健康领域的科普传播中&#xff0c;高质量、直观易懂的视觉内容是提升公众认知的关键。然而&#xff0c;专业医学图像制作成本高、周期长&#xff0c;且受限于版权和隐私问题&#xff0c;难以大规模定制化…

作者头像 李华
网站建设 2026/4/25 22:16:17

未来AI穿搭趋势:M2FP实现像素级衣物区域提取

未来AI穿搭趋势&#xff1a;M2FP实现像素级衣物区域提取 &#x1f4cc; 引言&#xff1a;从人体解析到智能穿搭的跃迁 随着虚拟试衣、个性化推荐和AI时尚设计的兴起&#xff0c;精准的人体语义分割技术正成为下一代智能穿搭系统的核心基础设施。传统图像处理方法在面对多人场景…

作者头像 李华
网站建设 2026/4/25 23:08:41

10款开源人体解析模型测评:M2FP CPU版推理速度快2倍

10款开源人体解析模型测评&#xff1a;M2FP CPU版推理速度快2倍 在计算机视觉领域&#xff0c;人体解析&#xff08;Human Parsing&#xff09; 是一项关键的细粒度语义分割任务&#xff0c;旨在将人体分解为多个语义明确的身体部位&#xff0c;如头发、面部、上衣、裤子、手臂…

作者头像 李华