Vue3【十三】watch监视
Vue3 中的watch祝你能监视以下四种数据
- ref 定义的数据
- reactive定义的数据
- 函数返回一个值
- 一个包含上述内容的数组
案例截图
目录结构
案例代码
Person.vue
<template><div class="person"><!-- <h1>Watch情况1:监视【ref】定义的【基本类型】的数据</h1> --><!-- <h2>当前求和:{{ sum }}</h2><button @click="changeSum">累加+1</button> --><!-- <h1>Watch情况2:监视【ref】定义的【对象类型】的数据</h1> --><!-- <h1>Watch情况3:监视【reactive】定义的【对象类型】的数据</h1><h2>名字:{{ person.name }}</h2><h2>年龄:{{ person.age }}</h2><button @click="changeName">改名字</button><button @click="changeAge">改年龄</button><button @click="changePerson">改人</button> --><!-- <h1>Watch情况4:监视返回值函数 的数据</h1> --><h1>Watch情况5:监视上述多个数据</h1><h2>名字:{{ person.name }}</h2><h2>年龄:{{ person.age }}</h2><h2>汽车:{{ person.car.car1 }}、{{ person.car.car2 }}</h2><button @click="changeName">修改名字</button><button @click="changeAge">修改年龄</button><button @click="changeCar1">修改第一辆车</button><button @click="changeCar2">修改第二辆车</button><button @click="changeCar">修改整个车</button></div>
</template><script lang="ts" setup>
import { ref, reactive ,watch } from 'vue';
// Vue3 中的watch祝你能监视一下四种数据
// 1. ref 定义的数据
// 2. reactive定义的数据
// 3. 函数返回一个值
// 4. 一个包含上述内容的数组// 1. ref 定义的数据 --------------------------------
// const sum = ref(0);// 方法
// function changeSum(){
// sum.value++;
// }// 监视 和 停止监视
// const stopWatch = watch(sum, (newValue, oldValue) => {
// console.log('sum变了', newValue, oldValue);
// // 停止监视
// if(newValue > 10){
// stopWatch();
// }
// })// 2. ref 定义的对象类型数据 ----------------------------
// 数据
// const person = ref({
// name: '吕洞宾',
// age: 18000
// })// 方法
// function changeName(){
// person.value.name = '何仙姑';
// }
// function changeAge(){
// person.value.age++;
// }
// function changePerson(){
// person.value = {
// name: '铁拐李',
// age: 19000
// }
// }// 监视 情况一: 监视【ref】定义的【对象类型】的数据,监视的是对象的地址值
// watch(person, (newValue, oldValue) => {
// console.log('person变了', newValue, oldValue);
// })// 若要监视对象内部的数据,需要使用深度监视
// watch(person, (newValue, oldValue) => {
// console.log('person变了', newValue, oldValue);
// }, {deep: true})// 监视 情况二: 监视【ref】定义的【对象类型】的数据,监视的是对象的地址值
// 立刻监视 watch的第一个参数是被监视的数据,第二个参数是监视回调函数,第三个参数是配置对象(deep,immediate等等)
// watch(person, (newValue, oldValue) => {
// console.log('person变了', newValue, oldValue);
// },{deep:true,immediate: true})
// 若修改的是ref定义的对象中的属性,因为newValue和oldValue是同一个对象
// 若修改整个ref定义的对象,newValue是新值,newValue和oldValue是两个不同的对象// 监视 情况三: 监视【active】定义的【对象类型】的数据,且默认开启了深度监视 ----------------
// const person = reactive({
// name: '吕洞宾',
// age: 18000
// })
// // 方法
// function changeName(){
// person.name = '何仙姑';
// }
// function changeAge(){
// person.age++;
// }
// function changePerson(){
// // 批量修改对象属性,对象还是原来对象
// Object.assign( person , {
// name: '铁拐李',
// age: 19000
// })
// }
// // 监视
// watch(person, (newValue, oldValue) => {
// console.log('person变了', newValue, oldValue);
// })// 4. 函数返回值 -------------------------------------------------------------------------
let person = reactive({name: '吕洞宾',age: 18000,car: {car1: '奔驰',car2: '宝马'}
})
function changeName(){person.name += '何仙姑';
}
function changeAge(){person.age++;
}
function changeCar1(){person.car.car1 = '仙鹤';
}
function changeCar2(){person.car.car2 = '毛驴';
}
function changeCar(){person.car = {car1: '艾玛',car2: '雅马哈'}
}
// 监视 响应式对象中的某个属性,且该对象是基本类型的,需要写成函数式
// watch(() => person.name,(newValue, oldValue) => {
// console.log('name变了', newValue, oldValue);
// }
// )
// 监视 响应式对象中的某个属性,且该对象是对象类型的,可以直接写、也能写函数式 更推荐写函数
// 想要监视细节,需要手动开启深度监视
// watch(()=>person.car,(newValue, oldValue) => {
// console.log('car变了', newValue, oldValue);
// },{deep: true}
// )// 5.数组 监视多个数据---------------------------------------------------------------------------------
watch([()=>person.car.car1,()=>person.age],(newValue, oldValue) => {console.log('car1或年龄变了', newValue, oldValue);},{deep: true}
)</script><style scoped>
.person {background-color: #ff9e4f;box-shadow: 0 0 10px;border-radius: 30px;padding: 30px;
}button {margin: 0 10px;padding: 0 5px;box-shadow: 0 0 5px;;
}
</style>