You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue3中watch监听ref时newValue与oldValue始终相同的问题

问题:监听Ref对象新旧值始终相同的问题

我编写了如下代码,希望监听ref对象的newVal与oldVal:

const assessmentForm = ref<IAssessmentScheduleForm>({
      formMethodId: '',
      meetingLink: '',
      meetingSchedule: '',
      testPlaceId: '',
      testPlaceType: ''
    })

    watch(() => {
      return assessmentForm
    }, (val, oldVal) => {
      console.log(val, oldVal)
    }, { deep: true })

但即使添加了.value,打印出的newValue与oldValue仍然始终相同,请问我的代码是否遗漏了什么?

原因与解决办法

  • 核心原因:你监听的是ref的.value(也就是目标对象的引用),因为对象是引用类型,新旧值指向同一块内存地址,所以打印出来完全一致。Vue的深度监听只会追踪对象内部属性变化,但不会自动克隆旧对象生成独立副本。

  • 解决办法:监听时返回对象的独立副本,让新旧值指向不同的内存地址,就能看到真实的差异:

    1. 简单对象用扩展运算符生成副本:
    watch(() => ({ ...assessmentForm.value }), (val, oldVal) => {
      console.log(val, oldVal)
    }, { deep: true })
    
    1. 复杂嵌套对象用structuredClone生成深拷贝副本:
    watch(() => structuredClone(assessmentForm.value), (val, oldVal) => {
      console.log(val, oldVal)
    }, { deep: true })
    
  • 额外优化:如果只需监听单个属性,直接监听该属性即可,无需深度监听,新旧值会自然区分:

watch(() => assessmentForm.value.formMethodId, (val, oldVal) => {
  console.log(val, oldVal)
})

内容的提问来源于stack exchange,提问作者Rizky Firmansyah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 21:05:18