ref 不能直接替代 v-model 实现双向绑定,但它是 v-model 的响应式基础;v-model 是语法糖,依赖 ref 创建的响应式引用(.value)实现视图与数据同步,支持手动控制输入逻辑、动态表单管理及区分 dom 引用与响应式状态。

ref 变量本身不能直接“替代” v-model 实现双向绑定,但它可以作为 v-model 的底层支撑,配合使用实现更可控、更灵活的表单输入管理。关键在于:v-model 是语法糖,ref 是承载响应式数据的容器;真正起作用的是 ref 创建的响应式引用,而 v-model 负责自动同步视图与该引用。
ref 是 v-model 背后的响应式基础
v-model 并不是独立于响应式系统的黑盒。在 Vue 3 中,它依赖 ref(或 reactive)创建的响应式变量才能生效。例如:
-
必须用 ref 包裹初始值:比如
const name = ref(''),否则 v-model 绑定后无法触发视图更新; -
v-model="name" 实际等价于:
:value="name.value" @input="name.value = $event.target.value"(对 input 元素而言); - 也就是说,v-model 的“双向”本质,是靠 ref 提供的可读写响应式属性(
.value)来完成的。
不依赖 v-model,用 ref + 事件手动实现输入同步
如果你需要绕过 v-model(比如做输入校验拦截、格式化、防抖),可以用 ref 配合原生事件手动控制:
- 定义 ref:
const searchQuery = ref(''); - 绑定 value 属性:
<input :value="searchQuery.value">; - 在方法中处理逻辑并更新 ref:
function handleInput(e) { const val = e.target.value.trim(); if (val.length ; - 这样既保留了 ref 的响应式能力,又完全掌控了输入时机和赋值条件。
多个动态表单项中,ref 更适合集中管理
当表单字段数量不确定(如动态增删地址项),用 v-model 逐个绑定会冗余且难维护。此时可用数组 ref 存储 DOM 引用或数据引用:
- 用
const inputRefs = ref([])收集所有 input 元素:<input v-for="(item, i) in list" :ref="el => { if (el) inputRefs.value[i] = el }">; - 提交时遍历
inputRefs.value获取.value,无需预先声明每个字段的 ref 名; - 也可用
ref([])直接存数据:const fields = ref([{ name: '', phone: '' }]),再用v-model="fields.value[i].name"—— 这仍是基于 ref 的双向绑定,只是结构更灵活。
注意 ref 在表单中的常见误区
容易混淆 ref 的两种用途,需明确区分:
-
ref="xxx" 是获取 DOM 元素(如
this.$refs.xxx或组合式 API 中的ref()回调),用于直接操作元素(focus、select 等),不是响应式数据; - const xxx = ref(...) 是创建响应式数据,用于 v-model 或逻辑计算,这才是替代传统 data 声明的核心;
- 两者可共存,但目的不同:一个管“节点”,一个管“状态”。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










