shallowref 用于 vue 单文件组件中精准控制响应边界,仅对顶层数据响应,跳过深层字段的 proxy 初始化;修改需赋值 .value,内部字段变更不响应,可配合 triggerref 主动触发更新,并与 markraw 协同处理不可响应对象。

在 Vue 单文件组件中用 shallowRef 优化深层嵌套,关键是让响应式只作用于你真正需要更新的层级,跳过内部字段的 Proxy 初始化和依赖收集。它不是“禁用响应式”,而是“精准控制响应边界”。
只对整块数据做顶层响应
当某个嵌套对象整体作为不可变单元使用(比如表格原始数据、菜单配置、API 快照),你只会在切换页、刷新列表、替换整个结构时才需要触发更新,那就该用 shallowRef:
- 用
shallowRef(data)替代ref(data)或reactive(data) - 修改时必须赋值给
.value,例如list.value = newData才会触发更新 - 直接改内部字段如
list.value[0].status = 'done'不会响应——这正是你要的效果
配合 triggerRef 主动通知变更
有时你确实需要在不替换整个对象的前提下“告诉 Vue:这部分内容变了”,比如手动更新了 shallowRef 包裹对象的某个字段:

