445 字
2 分钟
Vue 3 的 ref 与相关 API

ref 是什么#

ref 接收一个值,返回一个 Ref 对象。这个对象只有一个 .value 属性,指向内部的值。

const count = ref(0)
count.value // 0
count.value = 1 // 触发更新

为什么需要 ref#

JavaScript 的原始类型(string、number、boolean)按值传递,没有办法跟踪读写,所以不能直接变成响应式。

ref 把这些值包进一个对象,读写都落在 .value 上,Vue 就能在 .value 的读取和写入处收集依赖、触发更新。

在 <template> 里,顶层 ref 会自动解包,不用写 .value。

Counter.vue
<script setup>
const count = ref(0)
</script>
<template>
<p>{{ count }}</p>
</template>

isRef#

判断一个值是不是 Ref 对象。

isRef(count) // true
isRef(0) // false

shallowRef#

创建一个浅响应式的 ref,只监听 .value 本身有没有被替换,不递归监听内部对象或数组。

const msg = shallowRef({ name: '小满' })
msg.value.name = '大满' // 不触发更新
msg.value = { name: '大满' } // 触发更新

改内部属性不触发,因为 shallowRef 不会把内部对象转成响应式;整体替换 .value 才触发,因为 .value 本身被换掉了。

triggerRef#

强制触发某个 shallowRef 的依赖更新,即使这次修改没有被代理到。

const msg = shallowRef({ name: '小满' })
const change = () => {
msg.value.name = '大满'
triggerRef(msg) // 手动触发视图更新
}

customRef#

自定义一个 ref,由你决定 get 和 set 里做什么,适合防抖、校验这类需要拦截读写的场景。

myRef.js
function myRef(value) {
return customRef((track, trigger) => {
return {
get() {
track() // 收集依赖
return value
},
set(newVal) {
value = newVal
trigger() // 触发更新
}
}
})
}

track 和 trigger 由 Vue 传入:get 里调用 track 声明这里依赖这个值,set 里调用 trigger 通知依赖方更新。

第 5 篇,共 19 篇本文属于系列

Vue 3 的 ref 与相关 API
https://www.choria.top/posts/vue3-ref/
作者
乔瑞雅·克林威尔
发布于
2026-04-08
许可协议
CC BY-NC-SA 4.0

分享文章

生成精美分享图或复制链接,与更多人分享本文。

继续阅读

沿着主题读

基于共同的标签与分类

换条路线

从其他文章中稳定抽取

最后更新于 ,距今已过 214 天

部分内容可能已过时