深入理解 Vue 3 的 watch及用法示例小结

 更新时间:2026年02月12日 11:22:58   作者:扶苏1002  
watch是Vue3中处理响应式数据变化逻辑的基石,这篇文章将带你深入理解Vue3中的watch,涵盖基础用法、高级配置以及与watchEffect的对比,感兴趣的朋友跟随小编一起看看吧

Vue 3 的响应式系统是其核心优势之一,而 watch 是处理响应式数据变化的“瑞士军刀”。相比于 watchEffect 的“自动追踪”,watch 提供了更精确的控制力,允许你指定监听哪些数据,并区分“旧值”与“新值”。

这篇文章将带你深入理解 Vue 3 中的 watch,涵盖基础用法、高级配置以及与 watchEffect 的对比。

🧐 什么是 watch?

在 Vue 3 的组合式 API 中,watch 是一个用于观察和响应响应式状态变化的 API。它类似于 Vue 2 中的 watch 选项,但在组合式 API 中更加灵活和强大。

核心特点:

  • 惰性执行watch 在创建时不会立即执行回调,只有当监听的数据发生变化时才会执行(除非配置 immediate: true)。
  • 精准控制:你可以明确指定监听哪个或哪些数据源。
  • 获取旧值:你可以很方便地获取到变化前的旧值和变化后的新值。

🚀 基础用法

在使用 watch 之前,需要先从 Vue 中导入它:

import { watch } from 'vue'

1. 监听单个数据源 (Ref)

最常见的情况是监听一个 ref

<script setup>
import { ref, watch } from 'vue'
const count = ref(0)
// 监听 count
watch(count, (newVal, oldVal) => {
  console.log(`count 从 ${oldVal} 变成了 ${newVal}`)
})
// 点击按钮时触发
const increment = () => {
  count.value++
}
</script>
<template>
  <button @click="increment">Count: {{ count }}</button>
</template>

2. 监听响应式对象的属性 (Getter 函数)

如果你想监听 reactive 对象的某个属性,或者监听一个计算属性,你需要传入一个getter 函数

<script setup>
import { reactive, watch } from 'vue'
const state = reactive({
  name: 'Alice',
  age: 25
})
// 监听 state.name
watch(
  () => state.name, 
  (newName, oldName) => {
    console.log(`名字从 ${oldName} 改为 ${newName}`)
  }
)
</script>

注意: 这里的 () => state.name 是一个函数,watch 会执行这个函数来获取要监听的值。

⚙️ 监听多个数据源

你可以通过传入一个数组来同时监听多个源。回调函数接收的参数也将是一个数组,分别对应新值和旧值。

<script setup>
import { ref, watch } from 'vue'
const firstName = ref('John')
const lastName = ref('Doe')
watch(
  [firstName, lastName], 
  ([newFirst, newLast], [oldFirst, oldLast]) => {
    console.log(`${oldFirst} ${oldLast} -> ${newFirst} ${newLast}`)
  }
)
</script>

📦 深度监听与立即执行

watch 接受第三个参数——一个配置选项对象。

1. 深度监听

默认情况下,watch浅层的。这意味着如果你监听一个响应式对象,直接修改其嵌套属性可能不会触发回调(取决于你监听的是整个对象还是特定属性)。

使用 deep: true 可以强制深度遍历,监听对象内部所有层级的变化。

watch(
  () => state, // 监听整个对象
  (newState, oldState) => {
    // 即使是 state.profile.address 变了,这里也会触发
  },
  { deep: true } 
)

2. 立即执行

使用 immediate: true,回调函数会在创建监听器时立即执行一次

watch(
  () => searchQuery.value,
  (query) => {
    // 页面加载时会立即执行一次,无需等待 query 变化
    fetchResults(query) 
  },
  { immediate: true } 
)

🛑 停止监听

watch 函数会返回一个 stop 函数。调用这个函数可以停止监听,防止内存泄漏或不必要的计算。

<script setup>
import { ref, watch } from 'vue'
const counter = ref(0)
const stopWatch = watch(counter, (newVal) => {
  if (newVal > 10) {
    console.log('超过10了,停止监听')
    stopWatch() // 停止监听
  }
})
</script>

⚖️ watch 与 watchEffect 的区别

初学者常混淆 watchwatchEffect,它们的主要区别如下:

特性watchwatchEffect
数据源需要明确指定监听源自动追踪副作用期间访问的响应式属性
执行时机默认惰性执行 (变化时触发)默认立即执行 (创建时触发)
旧值/新值容易获取需要手动维护变量来比较
适用场景执行数据变更的副作用 (如 API 调用)简单的副作用同步 (如更新 DOM)

何时使用 watch
当你需要根据某个特定状态的变化来执行异步操作或开销较大的操作时(例如:搜索建议、表单验证)。

📝 总结

watch 是 Vue 3 中处理响应式数据变化逻辑的基石。通过掌握以下几点,你可以更高效地编写 Vue 应用:

  1. 监听 Ref:直接传入 ref 变量。
  2. 监听 Reactive 属性:传入 getter 函数 () => obj.prop
  3. 配置项:善用 deepimmediate
  4. 清理副作用:记得在适当的时候调用 stop 函数。

希望这篇文章能帮助你更好地理解和使用 Vue 3 的 watch

到此这篇关于深入理解 Vue 3 的 watch及用法示例小结的文章就介绍到这了,更多相关vue watch用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vuejs中监听窗口关闭和窗口刷新事件的方法

    vuejs中监听窗口关闭和窗口刷新事件的方法

    今天小编就为大家分享一篇vuejs中监听窗口关闭和窗口刷新事件的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • vue项目 npm run build 打包项目防止浏览器缓存的操作方法

    vue项目 npm run build 打包项目防止浏览器缓存的操作方法

    这篇文章主要介绍了vue项目 npm run build 打包项目防止浏览器缓存的操作方法,本文给大家推荐两种方法,每种方法通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • 关于vue3使用particles粒子特效的问题

    关于vue3使用particles粒子特效的问题

    这篇文章主要介绍了关于vue3使用particles粒子特效的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • vue router使用query和params传参的使用和区别

    vue router使用query和params传参的使用和区别

    本篇文章主要介绍了vue router使用query和params传参的使用和区别,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • vue.js获得当前元素的文字信息方法

    vue.js获得当前元素的文字信息方法

    下面小编就为大家分享一篇vue.js获得当前元素的文字信息方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • 在vue3.0中如何配置代理

    在vue3.0中如何配置代理

    这篇文章主要介绍了在vue3.0中如何配置代理问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • 一起来学习Vue的组件化

    一起来学习Vue的组件化

    这篇文章主要为大家详细介绍了Vue的组件化,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • Javascript结合Vue实现对任意迷宫图片的自动寻路

    Javascript结合Vue实现对任意迷宫图片的自动寻路

    本文将结合实例代码介绍Javascript结合Vue实现对任意迷宫图片的自动寻路,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • vue.js实现简单轮播图效果

    vue.js实现简单轮播图效果

    这篇文章主要为大家详细介绍了vue.js实现简单轮播图效果的相关代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • mint-ui如何自定义messageBox样式

    mint-ui如何自定义messageBox样式

    这篇文章主要介绍了mint-ui如何自定义messageBox样式问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05

最新评论