Vue3中 watch、watchEffect 详解

在 Vue 3 中,watch API 得到了增强和重新设计,以提供更加灵活和强大的响应式数据监听能力。Vue 3 引入了 Composition API,其中 watch 函数是 Composition API 的一部分,允许你在 setup() 函数中直接监听响应式引用(ref)或响应式对象(reactive)的变化。

基本用法

在 Vue 3 的 Composition API 中,watch 函数的基本用法如下:

复制代码

javascript复制代码

|---|----------------------------------------------------------|
| | import { ref, watch, onMounted } from 'vue'; |
| | |
| | export default { |
| | setup() { |
| | const count = ref(0); |
| | |
| | // 监听 count 的变化 |
| | watch(count, (newValue, oldValue) => { |
| | console.log(`count 从 ${oldValue} 变成了 ${newValue}`); |
| | }); |
| | |
| | // 可以在 onMounted 中启动异步操作,并在完成后更新 count |
| | onMounted(() => { |
| | setTimeout(() => { |
| | count.value++; |
| | }, 1000); |
| | }); |
| | |
| | return { |
| | count, |
| | }; |
| | }, |
| | }; |

监听多个源

watch 也可以同时监听多个响应式引用或响应式对象,当它们中的任何一个发生变化时,都会执行回调函数。

复制代码

javascript复制代码

|---|-------------------------------------------------------------------------------------------------|
| | import { ref, watch } from 'vue'; |
| | |
| | export default { |
| | setup() { |
| | const firstName = ref('John'); |
| | const lastName = ref('Doe'); |
| | |
| | watch([firstName, lastName], ([newFirstName, newLastName], [oldFirstName, oldLastName]) => { |
| | console.log(`名字从 ${oldFirstName} ${oldLastName} 变成了 ${newFirstName} ${newLastName}`); |
| | }); |
| | |
| | return { |
| | firstName, |
| | lastName, |
| | }; |
| | }, |
| | }; |

深度监听

默认情况下,watch 只会监听响应式引用的值的变化,而不会深入监听对象内部属性的变化。如果你需要深度监听一个响应式对象,可以传递第三个参数 { deep: true }

复制代码

javascript复制代码

|---|----------------------------------------------------|
| | import { reactive, watch } from 'vue'; |
| | |
| | export default { |
| | setup() { |
| | const user = reactive({ |
| | name: 'John Doe', |
| | age: 30, |
| | }); |
| | |
| | watch(user, (newValue, oldValue) => { |
| | // 注意:这里不会触发,因为 user 对象引用没有变 |
| | // 除非使用深度监听 |
| | }, { deep: true }); |
| | |
| | // 深度监听 user 对象内部属性的变化 |
| | watch(() => user.name, (newName, oldName) => { |
| | console.log(`名字从 ${oldName} 变成了 ${newName}`); |
| | }); |
| | |
| | return { |
| | user, |
| | }; |
| | }, |
| | }; |

立即执行

如果你希望在监听开始时立即执行回调函数,可以传递 { immediate: true } 作为 watch 的第四个参数。

复制代码

javascript复制代码

|---|-------------------------------------------|
| | watch(count, (newValue, oldValue) => { |
| | // ... |
| | }, { immediate: true }); |

停止监听

watch 函数返回一个停止监听的函数。你可以调用这个函数来停止监听响应式数据的变化。

复制代码

javascript复制代码

|---|-------------------------------------------------------------|
| | const stopWatch = watch(count, (newValue, oldValue) => { |
| | // ... |
| | }); |
| | |
| | // 停止监听 |
| | stopWatch(); |

这些是使用 Vue 3 中 watch 函数的基本和高级用法。通过灵活使用这些功能,你可以有效地管理组件中的响应式数据变化。

相关推荐
木西1 分钟前
Gemini 3 最新版!Node.js 代理调用教程
前端·node.js·gemini
婷婷婷婷11 分钟前
表格组件封装详解(含完整代码)
前端
前端Hardy11 分钟前
祝大家 2026 年新年快乐,代码无 bug,需求一次过
javascript·css·html
晴虹12 分钟前
lecen:一个更好的开源可视化系统搭建项目--页面设计器(表单设计器)--全低代码|所见即所得|利用可视化设计器构建你的应用系统-做一个懂你的人
前端·后端·低代码
小皮虾17 分钟前
这应该是前端转后端最简单的办法了,不买服务器、不配 Nginx,也能写服务端接口,腾讯云云函数全栈实践
前端·javascript·全栈
码途进化论18 分钟前
Vue3 防重复点击指令 - clickOnce
前端·javascript·vue.js
神秘的猪头20 分钟前
🎣 拒绝面条代码!手把手带你用自定义 Hooks 重构 React 世界
javascript·react.js
小二·23 分钟前
从零手写俄罗斯方块(Tetris)——前端工程化实战与性能优化
前端·性能优化
xiaoxue..34 分钟前
高频事件的“冷静剂” 闭包的实用场景:防抖与节流
前端·javascript·面试·html·编程思想
优弧1 小时前
2025 提效别再卷了:当我把 AI 当“团队”,工作真的顺了
前端