# Vue3教程 - 8 watchEffect

watchEffectwatch 的功能很相似,都是用来监视数据的变化。

有什么区别呢?

watch 需要明确指出监视的数据,而 watchEffect 不用明确指出监视的数据。

举个栗子:

一辆小车,前面和后面分别安装了避障传感器,但前面的距离或后面的距离小于20cm,就停止。使用 watch ,需要监视前后的避障传感器的数据,然后进行判断。

可能编写的代码如下:

<template>
  <div>{{ frontDistance }} cm</div>
  <div>{{ backDistance }} cm</div>

  <button @click="changeFrontDistance">减少前面距离</button>
  <button @click="changeBackDistance">减少后面距离</button>
</template>

<!-- setup -->
<script lang="ts" setup>
import { ref, watch } from 'vue'  // 1.引入 watchEffect

let frontDistance = ref(100)
let backDistance = ref(100)

// 修改前面的距离
function changeFrontDistance() {
  frontDistance.value -= 10
}

// 修改后面的距离
function changeBackDistance() {
  backDistance.value -= 10
}

// 监视前后距离
watch([frontDistance, backDistance], (newValue)=> {
  // 从数组中获取到值
  let [frontValue, backValue] = newValue
  if (frontValue <= 20 || backValue <= 20) {
    console.log("停止")
  }
})
</script>
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

在上面的代码中,通过按钮减少前后的距离,用于测试。通过 watch 监视前后距离,距离小于等于20 ,则停止。

使用 watch ,需要使用哪些数据进行判断,就需要明确指出要监视的数据。

而使用 watchEffect,不用明确指出监视的数据,watchEffect 的参数是一个函数,函数中用到哪些数据就会监视哪些数据的变化。

所以使用 watchEffect 替换 watch 实现上面的功能,可以修改代码如下:

// 监视前后距离
watchEffect(()=> {
  console.log(frontDistance.value, backDistance.value)
  if (frontDistance.value <= 20 || backDistance.value <= 20) {
    console.log("停止")
  }
})
1
2
3
4
5
6
7

另外,watchEffect 在页面第一次加载的时候,就会执行一次。