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

ref 是什么
ref 接收一个值,返回一个 Ref 对象。这个对象只有一个 .value 属性,指向内部的值。
const count = ref(0)
count.value // 0count.value = 1 // 触发更新为什么需要 ref
JavaScript 的原始类型(string、number、boolean)按值传递,没有办法跟踪读写,所以不能直接变成响应式。
ref 把这些值包进一个对象,读写都落在 .value 上,Vue 就能在 .value 的读取和写入处收集依赖、触发更新。
在 <template> 里,顶层 ref 会自动解包,不用写 .value。
<script setup>const count = ref(0)</script>
<template> <p>{{ count }}</p></template>isRef
判断一个值是不是 Ref 对象。
isRef(count) // trueisRef(0) // falseshallowRef
创建一个浅响应式的 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 里做什么,适合防抖、校验这类需要拦截读写的场景。
function myRef(value) { return customRef((track, trigger) => { return { get() { track() // 收集依赖 return value }, set(newVal) { value = newVal trigger() // 触发更新 } } })}track 和 trigger 由 Vue 传入:get 里调用 track 声明这里依赖这个值,set 里调用 trigger 通知依赖方更新。
Vue 3 学习笔记
连载中Vue 3 的 ref 与相关 API
https://www.choria.top/posts/vue3-ref/分享文章
生成精美分享图或复制链接,与更多人分享本文。
继续阅读
换条路线
从其他文章中稳定抽取
最后更新于 ,距今已过 214 天
部分内容可能已过时