1. Vue 2 与 Vue 3 中的 ref 核心概念解析
1.1 ref 的本质与设计初衷
ref 是 Vue 响应式系统的核心 API 之一,它的本质是一个包含 value 属性的响应式引用对象。在 Vue 2 中,ref 主要通过模板引用的方式使用,而在 Vue 3 中,它被扩展为同时支持模板引用和响应式数据管理。
Vue 3 引入 ref 的主要目的是解决原始值(primitive values)的响应式问题。在 JavaScript 中,基本类型(如 number、string、boolean)是按值传递的,无法直接追踪变化。ref 通过将这些值包装在具有 value 属性的对象中,实现了对原始值的响应式追踪。
javascript复制// Vue 3 中的 ref 基本用法
const count = ref(0)
console.log(count.value) // 0
count.value++ // 响应式更新
1.2 Vue 2 与 Vue 3 的 ref 实现差异
Vue 2 中的 ref 主要作为模板引用使用,通过给 DOM 元素或组件添加 ref 属性来获取实例引用:
html复制<!-- Vue 2 模板引用 -->
<template>
<div ref="myDiv">Hello Vue 2</div>
</template>
<script>
export default {
mounted() {
console.log(this.$refs.myDiv) // 获取DOM元素
}
}
</script>
Vue 3 在保留模板引用功能的同时,通过 Composition API 将 ref 提升为响应式数据管理的核心工具:
javascript复制// Vue 3 组合式API中的ref
import { ref } from 'vue'
export default {
setup() {
const count = ref(0)
function increment() {
count.value++
}
return {
count,
increment
}
}
}
关键区别:Vue 2 的 ref 主要用于获取组件/DOM 引用,而 Vue 3 的 ref 既是模板引用工具,也是响应式数据的基本单元。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. ref 的深度使用场景与技巧
2.1 模板中的自动解包机制
Vue 3 的 ref 在模板中使用时会自动解包(unwrapping),这意味着在模板中可以直接使用 ref 变量而不需要 .value:
html复制<template>
<!-- 自动解包,无需.value -->
<button @click="increment">{{ count }}</button>
</template>
但需要注意几个特殊情况:
- 当 ref 是响应式对象的属性时,不会自动解包
- 在数组或集合类型(Map/Set)中使用 ref 时,不会自动解包
- 在嵌套对象结构中,只有顶层 ref 会自动解包
2.2 ref 与 reactive 的配合使用
ref 和 reactive 是 Vue 3 响应式系统的两个核心 API,它们可以配合使用:
javascript复制const user = reactive({
id: ref(1), // 自动解包
name: 'John'
})
console.log(user.id) // 1 (自动解包)
console.log(user.name) // 'John'
当 ref 作为 reactive 对象的属
