Vue3 watch方法----监视对象

使用watch时,如果想监视对象的内部属性值。需要使用watch的第三个参数的配置对象,手动开启深度监视。

//使用watch时如果想监视对象内部的属性值,需要使用watch的第三个参数,手动开启深度监视
watch(person, (newValue, oldValue)=>{
    console.log('person发生了变化',newValue, oldValue);
}, {
    deep:true
})

注意:在对象中如果这个person没有经过深度拷贝的话,那么newValue和oldValue的值是一样的。

如果想要监视对象里面的某个属性,那么需要时用箭头函数返回这个属性,例如:

watch(()=>{return person.name}, (newVal, oldVal) => {
    console.log(newVal, oldVal);
}) 
<template>
    <!-- 
        watch;监视ref定义的对象类型的数据
    -->
    <div class="person">
        姓名:{{ person.name }}
        年龄:{{ person.age }}
        <button @click="changeName">修改姓名</button>
        <button @click="changeAge">修改年龄</button>
    </div>
</template>
<script setup lang="ts">
// 需求:当值大于多少时,执行什么操作
import { reactive, watch } from "vue";
let person = reactive({
    name:"zhangsan",
    age:18
})
function changeName() {
    person.name = "王五"
}
function changeAge() {
    person.age = 20
}

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

</script>

<style scoped>
.person {
    background: #ddd;
    box-shadow: 0 0 10px;
    border-radius: 10px;
    padding: 20px;
}
button {
    margin: 0 5px;
}
</style>

上述代码,只有在person.name发生改变的时候,watch方法才会发生改变。

如果监视一个整个的对象,那么建议函数返回值,并且开启深度监视,如下(person.car是一个对象):

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

 如果要监测多个对象,那么就需要用数组进行包裹

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

 

posted @ 2024-10-06 19:38  洛飞  阅读(77)  评论(0编辑  收藏  举报