Skip to content

watchEffect 错误的使用方式

在 Vue 的 watchEffect 中,依赖的收集是基于响应式的数据读取。如果某个条件分支导致某些响应式数据没有被读取,Vue 就无法收集这些响应式数据的依赖。这会导致某些情况下响应式数据的变更无法触发 watchEffect 的重新执行。

错误示例 1

vue
<script setup lang="ts">
import { ref, watchEffect } from 'vue'

const a = ref(true)
const b = ref(false)

watchEffect(() => {
  if (a.value || b.value) {
    console.log('a 或 b 为 true')
  }

  console.log('执行了watchEffect')
})
</script>

<template>
  <button @click="b = !b">点我</button>

  <p>a的值:{{ a }}</p>
  <p>b的值:{{ b }}</p>
</template>

错误原因

watchEffect 中,当 a.valuetrue 时,由于逻辑短路 (|| 运算符的短路行为),b.value 不会被访问。这意味着 b.value 不会被 Vue 的响应式系统收集为依赖。当你点击按钮切换 b 的值时,watchEffect 不会重新执行。

跳转到 Vue演练场 查看效果。

错误示例 2

vue
<script setup lang="ts">
import { ref, watchEffect } from 'vue'

const a = ref(1)
const b = ref(false)

watchEffect(() => {
  if (b.value) {
    console.log('a的值: ' + a.value)
  }

  console.log('执行了watchEffect')
})
</script>

<template>
  <button @click="a++">点我</button>

  <p>a的值:{{ a }}</p>
  <p>b的值:{{ b }}</p>
</template>

错误原因

watchEffect 收集依赖时,发现 b.valuefalse,所以就没有收集到 a.value 的依赖。当你点击按钮切换 a 的值时,watchEffect 不会重新执行。

跳转到 Vue演练场 查看效果。




远方大佬的讲解: 抖音:watchEffect竟然不会执行