网站首页 > 精选文章 正文
在 Vue3 的响应式系统中,watch 是监听数据变化的核心 API 之一。随着 Composition API 的普及,开发者需要更清晰地理解副作用管理机制。
一、Vue3 的 watch 机制
1.1 基本用法
import { ref, watch } from 'vue'
const count = ref(0)
// 基本监听模式
const stopWatch = watch(count, (newVal, oldVal) => {
console.log(`值从 ${oldVal} 变为 ${newVal}`)
})
// 停止监听
// stopWatch() // 手动调用停止监听
1.2 自动停止机制
当在组件 setup() 中同步创建时,Vue3 会自动关联生命周期:
export default {
setup() {
const count = ref(0)
// 自动绑定组件生命周期
watch(count, (val) => {
console.log('Count changed:', val)
})
return { count }
}
}
组件卸载时,Vue 会自动停止这些监听器,无需手动干预。
二、必须手动清除的 3 种场景
2.1 异步创建的监听器
import { onMounted, onUnmounted } from'vue'
exportdefault {
setup() {
let stopWatch = null
onMounted(() => {
// 异步创建监听器
setTimeout(() => {
stopWatch = watch(/* ... */)
}, 1000)
})
onUnmounted(() => {
if (stopWatch) {
stopWatch() // 必须手动清除
}
})
}
}
关键点:Vue 无法追踪异步创建的监听器,需要开发者自行管理
2.2 动态条件监听
const searchKeyword = ref('')
let searchWatch = null
// 根据用户操作动态创建
function enableSearch() {
searchWatch = watch(searchKeyword, () => {
// 执行搜索逻辑
})
}
function disableSearch() {
searchWatch?.() // 主动销毁
}
典型场景:需要运行时动态启用的监听逻辑。
2.3 全局状态监听
// store.js
import { watch } from'vue'
import store from'./store'
// 全局监听(危险操作!)
let globalWatcher = null
exportfunction initGlobalWatch() {
globalWatcher = watch(
() => store.state.user,
(user) => {
console.log('User changed:', user)
}
)
}
exportfunction cleanupGlobalWatch() {
globalWatcher?.()
}
风险提示:全局监听器不会自动销毁,必须提供显式清理接口。
三、智能管理方案
3.1 自动管理组合式函数
import { watchEffect, onScopeDispose } from'vue'
exportfunction useAutoCleanWatcher() {
const stop = watchEffect(() => {
// 副作用逻辑
})
// 自动注册清理
onScopeDispose(() => {
stop()
})
return { stop }
}
优势:利用 onScopeDispose 实现自动清理。
3.2 监听器工厂模式
function createSmartWatcher(source, callback) {
const stop = watch(source, callback)
return {
stop,
restart: () => {
stop()
return createSmartWatcher(source, callback)
}
}
}
// 使用示例
const { stop } = createSmartWatcher(value, () => {})
扩展性:封装重启功能,增强可维护性。
猜你喜欢
- 2025-06-13 前端必看!7 个 Vue3 性能优化实战技巧,让页面飞起来
- 2025-06-13 前端也能玩转截图?uni-app + Vue3 实现页面快照功能
- 2025-06-13 Vue2 升级 Vue3 一文通关(vue-cli2.0升级3.0)
- 2025-06-13 Vue2的16种传参通信方式(vue有几种传参方式)
- 2025-06-13 面试官:聊聊你知道的Vue与React的区别
- 2025-06-13 vue3.0总结之ref与reactive(vue ref reactive)
- 2025-06-13 90% 的前端工程师都不知道的 Vue3 实战神操作,看完直呼后悔没早学
- 2025-06-13 vue3 组件初始化流程(vue组件初始化顺序)
- 2025-06-13 从 React 过渡到 Vue 3:开发者的实践指南
- 2025-06-13 vue重定向(vue重定向后403报错)
- 最近发表
-
- Vue基础入门,第15节 一键页面换新衣,动态修改样式的3种方法
- uniapp Vue3.x组件库uview-vue3(uniapp用什么组件库)
- Vue3 样式绑定: 内联样式与Class属性的数组语法
- Vue2的样式(class和style)绑定(vue样式scoped)
- 前端开发,在项目中常用的css样式整理
- 前端必看!7 个 Vue3 性能优化实战技巧,让页面飞起来
- 前端也能玩转截图?uni-app + Vue3 实现页面快照功能
- Vue2 升级 Vue3 一文通关(vue-cli2.0升级3.0)
- Vue2的16种传参通信方式(vue有几种传参方式)
- 面试官:聊聊你知道的Vue与React的区别
- 标签列表
-
- 向日葵无法连接服务器 (32)
- git.exe (33)
- vscode更新 (34)
- dev c (33)
- git ignore命令 (32)
- gitlab提交代码步骤 (37)
- java update (36)
- vue debug (34)
- vue blur (32)
- vscode导入vue项目 (33)
- vue chart (32)
- vue cms (32)
- 大雅数据库 (34)
- 技术迭代 (37)
- 同一局域网 (33)
- github拒绝连接 (33)
- vscode php插件 (32)
- vue注释快捷键 (32)
- linux ssr (33)
- 微端服务器 (35)
- 导航猫 (32)
- 获取当前时间年月日 (33)
- stp软件 (33)
- http下载文件 (33)
- linux bt下载 (33)