2026/6/20 7:25:14
网站建设
项目流程
网站建设的风格,传媒公司产品宣传片,域名只做邮箱没网站要备案吗,百度html代码在 Vue 3 的组合式 API 中#xff0c;reactive()和 ref()都是创建响应式数据的核心 API#xff0c;但它们的设计目标、适用场景和使用方式有本质区别。1. 核心定位#xff1a;处理的数据类型不同reactive()#xff1a;仅用于包装「对象类型」#xff08;包括普通对象、数组…在 Vue 3 的组合式 API 中reactive()和ref()都是创建响应式数据的核心 API但它们的设计目标、适用场景和使用方式有本质区别。1. 核心定位处理的数据类型不同reactive()仅用于包装「对象类型」包括普通对象、数组、Map、Set 等返回一个深层响应式的 Proxy 代理对象。它无法直接处理基本类型如string、number、boolean否则会抛出警告且无效。ref()可以包装「任意类型」基本类型 对象类型返回一个RefT类型的响应式容器本质是带.value属性的对象。对于对象类型ref()内部会自动调用reactive()将其转换为深层响应式 Proxy。2. 访问方式是否需要.valuereactive()直接访问对象的属性无需额外语法。示例import { reactive } from vue const user reactive({ name: Alice, age: 20 }) console.log(user.name) // 直接访问 → Alice user.age // 直接修改 → 响应式更新ref()必须通过.value访问或修改内部值模板中会自动解包无需写.value。示例import { ref } from vue const count ref(0) // 包装基本类型 console.log(count.value) // 必须加 .value → 0 count.value // 修改值 → 响应式更新 const user ref({ name: Bob }) // 包装对象类型内部转 reactive console.log(user.value.name) // 先 .value 拿到代理对象 → Bob user.value.age 21 // 修改属性 → 响应式更新3. 赋值行为能否直接替换整个数据reactive()不能直接替换整个对象会丢失响应式。因为reactive()返回的是原对象的 Proxy 代理若直接赋值新对象如state { ... }新对象未被 Proxy 包裹不再是响应式的。错误示例const state reactive({ count: 0 }) state { count: 1 } // ❌ 错误直接替换对象失去响应式ref()可以直接修改.value无论基本类型还是对象类型。因为ref()的.value是可变的容器替换.value会触发响应式更新。正确示例const count ref(0) count.value 1 // ✅ 正确修改 .value → 响应式更新 const user ref({ name: Tom }) user.value { name: Jerry } // ✅ 正确替换整个对象 → 响应式更新4. 适用场景如何选择场景推荐 API原因处理基本类型数字、字符串、布尔ref()reactive()无法处理基本类型必须用ref()包装。处理单值对象如一个配置项ref()方便通过.value整体替换避免reactive()的赋值陷阱。处理复杂对象/数组多属性、嵌套结构reactive()直接访问属性更简洁无需.value。需要统一响应式逻辑全用一种 APIref()所有类型都能用ref()包装对象类型内部转reactive风格一致。5. 模板中的使用差异reactive()直接在模板中使用代理对象的属性无需额外处理。示例template div{{ user.name }} ({{ user.age }})/div /template script setup import { reactive } from vue const user reactive({ name: Alice, age: 20 }) /scriptref()模板中自动解包无需写.value直接用变量名访问。示例template div{{ count }}/div !-- 自动解包 count.value -- div{{ user.name }}/div !-- 自动解包 user.value.name -- /template script setup import { ref } from vue const count ref(0) const user ref({ name: Bob }) /script补充toRefs()与reactive()的配合当需要将reactive()对象的属性解构到组件中时避免失去响应式可以用toRefs()将每个属性转为refimport { reactive, toRefs } from vue const state reactive({ count: 0, name: Alice }) const { count, name } toRefs(state) // 转为 ref 对象 console.log(count.value) // 0需用 .value 访问总结一句话区分reactive()给对象/数组穿件「响应式外套」直接摸属性ref()给任何数据装个「响应式盒子」开盒子用.value模板里自动开。如果是新手建议优先用ref()处理所有类型避免踩坑若明确处理复杂对象用reactive()更简洁。两者可以混合使用核心是理解它们的响应式边界~惠州大亚湾