这是我参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战
上文讲到了watch函数中的几种情况,还没有讲完,所以本文接着上文继续讲...
上文最后写了解决用reactive定义的对象的oldValue的方法如下:
解决方法:
let person = ref({job:'前端工程师',age:18}),
watch(person.value,(newValue,oldValue)=>{
console.log('person变化了',newValue,oldValue)
})
这个我后来仔细看了下,是错误的,实在是抱歉,希望大家不要被我误导,这个写法也无法获取到正确的oldvalue值,那我们应该怎样去获取到正确的oldvalue的值呢:如下
正确的写法,应该是监听到他里面的属性值
watch(()=>person.age,(newValue,oldValue)=>{
console.log('person.age的值改变了',newValue,oldValue)
})
那我们要同时监听几个属性可以这样写:
let b = reactive({
age:118,
descript:{
salary:70
}
})
let a = ref(0)
watch([()=>b.age,a],(newValue , oldValue)=>{
console.log('b的age或a改变了',newValue , oldValue)
})
这里因为监听的b的age属性是简单类型的数据,所以能当b.age或a改变时,就能监听到数据的变化,并正确打印oldValue值
但是:若监听的属性为b变量的descript属性时,这样写就有点问题:当descript改变时,watch监听不到变化
watch(()=>b.descript,(newValue , oldValue)=>{ //默认监听不打开深度监听,要配置deep:true
console.log('b的descript改变了',newValue , oldValue)
},{deep:true})
这个时候要加deep:true属性
watch的套路是:既要指明监视的属性,也要指明监视的回调
watchEffect的套路是:不指明监视哪个属性,监视的回调中用到哪个属性,就监视哪个属性
watchEffect有点像computed:
但computed注重的计算出来的值(hUI掉函数的返回值),所以必须要写返回值
而watchEffect更注重的是过程(回调函数的函数体),所以不用写返回值
//watchEffect所指定的回调中用到的数据只要发生变化,则直接重新执行回调
watchEffect(()=>{
const x1 = sum.value
const x2 = person.age
console.log('watchEffect配置的回调执行了')
)
当sum变量,person的age属性有更改是就会触发watchEffect的回调函数,回调中的代码,个人感觉这个要比watch方便的多,并且watchEffect还比较精准,比如上面的代码,person的其他属性的变化,是不会触发watchEffect回调的