vue的ref实现
Vue 中 ref 的实现原理
Vue 的 ref 是一个用于获取 DOM 元素或组件实例的响应式引用。它通过创建一个响应式对象,将引用的值存储在 .value 属性中。
基本用法
在模板中通过 ref 属性标记元素或组件:
<template>
<div ref="myDiv">Hello World</div>
<ChildComponent ref="child" />
</template>
在脚本中通过 ref() 函数创建引用:

import { ref } from 'vue'
const count = ref(0)
实现机制
Vue 3 的 ref 实现基于 Proxy 和响应式系统:
- 当调用
ref(value)时,会创建一个 RefImpl 实例 - 该实例将原始值包装在
.value属性中 - 对
.value的访问和修改会被追踪,触发响应式更新
模板 ref 的特殊处理
当在模板中使用 ref 属性时:

- 在组件挂载后,对应的 DOM 元素或组件实例会被自动赋值给
this.$refs对象 - 如果用在 v-for 内部,
$refs会是一个数组 - 组合式 API 中需要通过同名变量访问
类型定义
TypeScript 中的类型定义展示了 ref 的结构:
interface Ref<T> {
value: T
}
与 reactive 的区别
ref可以包装基本类型(如 number, string)reactive只能用于对象类型- 模板中使用
ref不需要.value,脚本中需要 ref通过.value访问,reactive直接访问属性
自定义 ref
可以通过 customRef 创建具有自定义行为的 ref:
import { customRef } from 'vue'
function useDebouncedRef(value, delay = 200) {
return customRef((track, trigger) => {
return {
get() {
track()
return value
},
set(newValue) {
clearTimeout(timeout)
timeout = setTimeout(() => {
value = newValue
trigger()
}, delay)
}
}
})
}
性能考虑
- 避免过度使用模板
ref,优先考虑 props 和事件 - 大量使用
ref可能影响性能,特别是在频繁更新的场景 - 组合式 API 中的
ref比选项式 API 的$refs更灵活
常见使用场景
- 访问 DOM 元素进行直接操作
- 调用子组件的方法
- 表单输入的双向绑定
- 需要响应式的基本类型值
- 与第三方库集成时需要 DOM 引用






