vue3中watch和watchEffect

文章类型:Vue

发布者:admin

发布时间:2023-03-19

在vue3中,watch和watchEffect都可以监听data属性的变化

一:watch

主要是需要明确监听那个属性的变化以及回调,是一种惰性执行,初始化不会执行

主要是监听ref、reactive、计算属性、getter 函数

响应式数据会隐式添加一个深度监听器,而getter 函数方式则属性值变化不会触发

A:属性值:watch( source, cb, [options] )

1:source:表达式或者函数,指定监听的依赖对象

2:cb:变化后执行的回调函数

3:options:有 immediate(立即触发回调函数)、deep(深度监听)

B:用法

1:监听单个值

const number = reactive({ count: 0 });
const countAdd = () => {
number.count++;
};
//单个
watch(number, (newValue, oldValue) => {
console.log("新的值:", newValue);
console.log("旧的值:", oldValue);
});

2:监听多个值

//多个getter 函数方式
watch(
[() => state.count, () => state.name],
([newCount, newName], [oldvCount, oldvName]) => {
console.log(oldvCount) // 旧的 count 值
console.log(newCount) // 新的 count 值
console.log(oldName) // 旧的 name 值
console.log(newvName) // 新的 name 值
}
)





3:监听计算属性

const newMessage = computed(() => {
return message.value;
});
watch(newMessage, (newValue, oldValue) => {
console.log("新的值:", newValue);
console.log("旧的值:", oldValue);
});

4:操作DOM,回调函数里面获取更新的数据

watch(source, callback, {
flush: 'post'
})

二:watchEffect

会根据其中的属性,自动监听(隐式监听)其中的变化,初始化时会立即执行一次

 watchEffect(() => {
console.log('state.name', state.name)
})

操作DOM,回调函数里面获取更新的数据

方式一:添加flush

watchEffect(callback, {
flush: 'post'
})

方式二:watchPostEffect后置刷新

watchPostEffect(()=>{/* 在 Vue 更新后执行 */})

特殊情况:

侦听器没随着组件销毁,需要进行手动销毁

const unwatch = watchEffect(() => {})
// ...当该侦听器不再需要时
unwatch()