Vue3-composition-api使用watch监控响应式数据
测试数据
测试的数据包含响应式的Number变量、string变量、复杂嵌套对象。
let num = ref(0);
let lunch = ref("??炒蛋");
let college = reactive({
name: "信带",
area: 2700,
// 对象里的对象需要开启深度监听
school: {
s1: {
name: "计软院",
},
},
});
vue3中从"vue"模块中引用的watch函数包含三个参数,第一个参数用于表示要监视的数据,第二个参数是一个包含两个参数的函数,其第一个参数是旧值,第二个参数是新值,函数体是用于处理新旧数据的逻辑。watch函数的第三个参数是一个配置对象,用于修改监听规则。
术语
- 深度监听: 对于对象的监听可以深入对象内部,将对象内的所有嵌套对象也加入监听。
- 直接监听: 在数据初始化时进行一次监听,即使此时数据还未修改。
监视单个数据的变化
watch(num, (oldv, newv) => {
console.log(`old=${oldv},new=${newv}`);
});
监视多个数据的变化
// 监视多个数据变化 新值、旧值都是数组
watch(
[num, lunch],
(oldv, newv) => {
console.log(oldv, newv);
},
{ immediate: true, deep: true }
)
监视reactive包裹的变量
// 无法获取旧值 且强制深度监听
watch(college, (oldv, newv) => {
console.log(oldv, newv);
})
监视对象中某一个属性
//此时第一个参数写成函数形式
watch(
() => college.area,
(oldv, newv) => {
console.log(oldv, newv);
}
);
watchEffect函数
watchEffect函数会对其函数体内使用到的响应式数据进行监听,当这些数据发生变化时将会执行参数内的函数体,且默认开启深度监听。该方法较上述使用传统watch函数的方法更为灵活,代码简洁性更高。
/*下述代码在college.school.s1.name发生变化时会执行console.log(tem)
打印name的新值
*/
watchEffect(() => {
let tem = college.school.s1.name;
console.log(tem);
});