shallowRef 和 ref 的区别

shallowRef 和 ref 都是 Vue 3 的响应式 API,它们的主要区别在于响应式的深度:

ref

  • 深度响应式:会自动递归地将所有嵌套属性都转为响应式
  • 适用于:需要完全响应式的复杂对象
javascript 复制代码
import { ref } from 'vue'

const state = ref({
  user: {
    name: 'John',
    address: {
      city: 'New York',
      street: '123 Main St'
    }
  }
})

// 所有这些修改都会触发响应式更新
state.value.user.name = 'Jane'           // 触发更新
state.value.user.address.city = 'Boston' // 触发更新

shallowRef

  • 浅层响应式 :只对 .value 本身的变化进行响应,不递归转换嵌套属性
  • 适用于:大型对象或不需要深度响应的场景,性能更好
javascript 复制代码
import { shallowRef } from 'vue'

const state = shallowRef({
  user: {
    name: 'John',
    address: {
      city: 'New York',
      street: '123 Main St'
    }
  }
})

// 只有这些会触发响应式更新
state.value = { ... }  // 直接替换整个值,触发更新

// 这些不会触发响应式更新!
state.value.user.name = 'Jane'           // 不触发更新
state.value.user.address.city = 'Boston' // 不触发更新

使用场景对比

ref 适用场景:

javascript 复制代码
// 需要深度响应的表单数据
const formData = ref({
  personalInfo: {
    name: '',
    age: ''
  },
  preferences: {
    theme: 'light',
    notifications: true
  }
})

shallowRef 适用场景:

javascript 复制代码
// 大型不可变数据,只需要整体替换
const largeData = shallowRef({ /* 大量数据 */ })

// 第三方库实例,不需要响应式
const mapInstance = shallowRef(null)

// 性能敏感场景
const heavyObject = shallowRef({ /* 复杂嵌套对象 */ })

强制触发更新

如果需要让 shallowRef 的嵌套属性变化触发更新:

javascript 复制代码
const state = shallowRef({ count: 0 })

// 方法1:整体替换
state.value = { ...state.value, count: 1 }

// 方法2:使用 triggerRef
import { triggerRef } from 'vue'
state.value.count = 1
triggerRef(state) // 手动触发更新

总结

  • ref:深度响应式,适合需要完全响应性的数据
  • shallowRef:浅层响应式,性能更好,适合大型对象或只需要整体替换的场景

选择哪个取决于你对数据响应式深度的需求和性能考虑。

相关推荐
jay神3 分钟前
基于 YOLOv8 的森林火灾检测系统(Web 版)
前端·yolo
code2cat8 分钟前
HTML基础篇之第一张网页:从index.html到浏览器里的任务清单
前端·html
miss1 小时前
AI 改完不敢上线?OpenSpec 规约驱动开发实战
前端·代码规范·前端工程化
AiMan2 小时前
腾讯ima还是不可以导出左侧所有对话,只能单条导出,方法不对吗
前端
去伪存真2 小时前
并发量一高就装死?Agent 全链路“防猝死”手册
前端·agent
Moment2 小时前
AI 编程时代,聊聊我的 Mac mini 双屏桌面
前端·后端
AiMan2 小时前
先确认能不能一次把Microsofat Copilot所有内容打包一个文件导出
前端
总要学点什么2 小时前
第97篇:三维数据加载-城市建筑白模自定义着色器——让一条光带沿高度扫上去,快慢却由帧率说了算
前端·gis·webgl·cesium·着色器·空间分析·白模
上海懒图科技2 小时前
工厂厂区电子地图定位导航:厂区人车精准定位,安全合规双保障
前端·arcgis·vue
西安小哥3 小时前
端侧跑大模型,真正的门槛不在参数量:一次 596 秒到 10 秒的压缩路径复盘
前端·人工智能