在前面的Options API中,我们可以通过watch选项来侦听data或者props的数据变化,当数据变化时执行某一些操作。
在Composition API中,我们可以使用watchEffect和watch来完成响应式数据的侦听;
- watchEffect用于自动收集响应式数据的依赖;
- watch需要手动指定侦听的数据源;
watchEffect的基本使用
- watchEffect传入的函数会被立即执行一次,并且在执行的过程中会收集依赖
- 只有收集的依赖发生变化时,watchEffect传入的函数才会再次执行
首先需要引入import { ref, watchEffect } from 'vue';
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21setup() {
// watchEffect: 自动收集响应式的依赖
const name = ref("kobe");
const age = ref(18);
const changeName = () => name.value = "beichen";
const changeAge = () => age.value++;
watchEffect(() => {
// 会立即执行,因为他要收集所用到了那些响应式的依赖
// 相当于watch中的immediate(立即执行)
console.log("name:", name.value, "age: ", age.value);
})
return {
name,
age,
changeName,
changeAge
}
}
watchEffect的停止侦听
在age大于25时停止监听
watchEffect的返回值也是一个函数,通常返回的函数定义stop
,调用该函数即可。
1 | <template> |
watchEffect清除副作用
1 | <template> |
watchEffect执行时机和ref的引用
1 | <template> |
watchEffect和watch的比较
watch
- 懒执行副作用(第一次不会执行),watchEffect会立即执行(immediate)
- 更具体的说明了那些状态发生改变,出发监听器的执行
- 访问监听状态变化前后的值,watchEffect只能拿到变化后的值
watch侦听单个数据源
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55<template>
<div>
<h2>{{info.name}}</h2>
<button @click="changeData">修改</button>
</div>
</template>
<script>
import { reactive, ref, watch } from "vue";
export default {
setup() {
const info = reactive({
name: "Kobe",
age: 18
})
// 1.侦听watch时,传入一个getter函数
// watch(() => info.name, (newValue, oldValue) => {
// console.log("newValue:", newValue, "oldValue:", oldValue);
// })
// 2.传入一个可响应式对象: reactive对象/ref对象
/*
* 情况一:reactive对象获取到的newValue和oldValue本身都是reactive对象
* 情况二:ref对象获取到的newValue和oldValue是value值的本身
*/
// 情况一:
// watch(info, (newValue, oldValue) => {
// console.log("newValue:", newValue, "oldValue:", oldValue);
// })
// 情况一.1 如果希望获取到的newValue和oldValue是一个普通的对象
watch(() => ({...info}), (newValue, oldValue) => {
console.log("newValue:", newValue, "oldValue:", oldValue);
})
// 情况二:
// const name = ref("beichen");
// watch(name, (newValue, oldValue) => {
// console.log("newValue:", newValue, "oldValue:", oldValue);
// })
const changeData = () => {
info.name = "james";
}
return {
info,
changeData
}
}
}
</script>
watch侦听多个数据源
1 | <template> |
watch侦听响应式对象/watch选项
1 | <template> |