在vue 3.2.13 版本中出现了watch深度监视,无法获取到oldValue的问题:
1.watch默认关闭深度监视,有效果,可以开启深度监视,但是无法监视到ref和reactive中的深层数据。
数据结构如下:
let person =reactive({
firstName:"1",
lastName:"2",
job:{ //这个就是深层结构 ,对象中的对象
salary:100
}
})
使用vue2的写法:在setup外写vue2的watch:经过测试,无法解决,只有object
效果:只是个object,vue2的watch对高版本并不完全兼容
经过一系列测试总结:
1.vue3.1.2的watch监视对象,默认开启深度监视可以关闭deep,需要自己开启deep(有效果),而且不能获取到oldValue
watch(person,(oldValue,newValue)=>{
console.log("oldevalue",oldValue,"newValue",newValue)
})
2.watch监视对象中的属性,默认开启正常监视,可以获取到oldValue
watch(()=>person.firstName,(oldValue,newValue)=>{
console.log("oldevalue",oldValue,"newValue",newValue)
})
3.watch监视对象中的对象,默认不开启深度监视,需要自己开启(有效果),而且不能获取到oldValue
//监视对象中的对象:
watch(()=>person.job,(oldValue,newValue)=>{
console.log("oldevalue",oldValue,"newValue",newValue)
},{deep:true})
针对无法获取到oldValue对象的解决办法:
1.将对象中的深层次属性(对象的对象中的属性)定义为ref中的普通属性。
2.将对象中的深层次属性(对象的对象中的属性)改为对象中的普通属性。
3.压根不使用setup中的属性与watch,在vue3.1.2中写vue2的写法,data ,watch等,vue2没bug,不过要注意,在混用的时候尽量不要互相访问属性,也不建议混用。