记录学习vue3过程中watch监听遇到的各种问题(2024.03.28补充更新)

1. 在vue3中使用watch监听ref的一个数据变化

setup(){
    let num = 1 

    watch(num,(newVal,oldVal)=>{
        console.log(newVal,oldVal)
    })

    return {
        num,
    }
}

4f04d56f68fa49db85d886a56d3e02f3.png

监听一个基本类型数据,能够正常监听,并且新旧数据都能够监听到,

1.1 如果监听的是ref定义的对象数据

值得注意的是修改ref定义的对象数据时可以将整个对象直接赋值

let person = ref({
  name:'张三',
  age:18
})

function changePerson(){
  person.value = {name:'李四',age:90}
}

watch(person,(newValue,oldValue)=>{
  console.log('person变化了',newValue,oldValue)
},{deep:true})

92514711c01f4f5cb14d19817649f6e9.png

开启deep: true,才能够监听到对象中属性的变化,由于地址值没有改变,只是属性值改变了,所以新旧值都是属性值改变之后的对象

dcb08d619fef478fa289dbb078ce34c6.png

如果修改的是整个对象,则新旧数据会不同

 2. 在vue3中使用watch监听ref的多个数据变化

watch([num,msg], (newVal, oldVal) => {
   console.log(newVal, oldVal);
})

550a34f54aa64b1cb5d24c11ea5040c8.png

监听多个基本数据类型,能够正常监听,并且新旧数据都能够监听到,

3. 在vue3中使用watch监听reactive的数据变化

setup(){
    const person = reactive({
       name: "小明",
       age: 25,
       job: {
          j1: {
              salary: 14
          }
       }
    })

    const arr = reactive([1,2,3,4,5])

    watch(person, (newVal, oldVal) => {
        console.log(newVal, oldVal);
    }, {deep: false})

    watch(arr, (newVal, oldVal) => {
        console.log(newVal,oldVal);
    })

    return {
        person,
        arr
    }
}

0307c176d50d492689b40b6a6cf92aa2.png

此时就有问题了!!!

  • 通过这种方式监听不到旧数据,只能获取新数据(通过reactive定义的对象不能直接通过字面量的方式修改数据,丢失响应式)

(对上面问题新的理解:因为监听的是整个对象,修改的只是对象当中的某个属性,地址值并没有改变,所以监听到的还是原地址的数据,只是属性值变化了,所以新旧值相同,此外!!如果通过Object.assign等方式整体修改了对象,相当于地址值发生了变化,监听的就是新地址值,故展示的都是新值)

a66e4bf9497e4668b058aa6def02cc32.png

  • 只要监听的是一个复杂类型,就默认开启了deep:true,并且无法修改

4. 在vue3中使用watch监听reactive中的属性

watch(() => person.name, (newVal, oldVal) => {
    console.log(newVal, oldVal);
})

watch([() => person.name,() => person.age], (newVal, oldVal) => {
    console.log(newVal, oldVal);
})

5b9a06b855924a8988cfd01322af0752.png

监听对象中的属性的时候需要使用函数返回值的写法,否则监听不到,监听多个属性的时候可以使用数组的写法,同监听基本数据类型

5. 在 vue3中使用watch监听对象中的对象

watch(() => person.job, (newVal, olaVal) => {
   console.log(newVal,olaVal);
},{deep: true})

87a112abaa83410e9150eac4e17d9afe.png

此时又有问题了!!!

  • 此时如果不开启深度监听,则会监听不到该属性的变化,必须开启深度监听{deep:true}
  • 同监听复杂数据类型一样,监听不到旧数据 (理解同上)

 

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值