news 2026/7/10 13:21:09

vue3 wacth写法大全

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
vue3 wacth写法大全

Vue3 组合式API watch 完整可运行示例(仅script setup,带赋值+打印输出)

统一前置导入

vue
<script setup>
import { ref, reactive, watch, watchEffect, watchPostEffect, watchSyncEffect } from 'vue'
</script>

示例 1:监听单个 ref 基础用法

vue
<script setup>
import { ref, watch } from 'vue'
const num = ref(0)

watch(num, (newVal, oldVal) => {
console.log('新值:', newVal)
console.log('旧值:', oldVal)
})

// 修改数据
num.value = 10
// 输出:
// 新值:10
// 旧值:0
</script>

示例 2:watch 搭配 immediate 初始化立即执行

vue
<script setup>
import { ref, watch } from 'vue'
const num = ref(0)

watch(num, (newVal, oldVal) => {
console.log('新值:', newVal)
console.log('旧值:', oldVal)
}, { immediate: true })

// 无需修改,页面加载自动输出
// 首次加载输出:
// 新值:0
// 旧值:undefined

// 修改数据
num.value = 66
// 输出:
// 新值:66
// 旧值:0
</script>

示例 3:监听完整 reactive 对象(需 deep 深度监听)

vue
<script setup>
import { reactive, watch } from 'vue'
const user = reactive({ name: '小明', info: { age: 18 } })

watch(user, (newVal, oldVal) => {
console.log('新对象:', newVal)
console.log('旧对象:', oldVal)
}, { deep: true })

// 修改内层属性
user.info.age = 25
// 输出:
// 新对象:{ name: '小明', info: { age: 25 } }
// 旧对象:{ name: '小明', info: { age: 25 } }
</script>

示例 4:精准监听 reactive 单层属性(getter 函数,无需 deep)

vue
<script setup>
import { reactive, watch } from 'vue'
const user = reactive({ name: '小明', info: { age: 18 } })

watch(() => user.name, (newVal, oldVal) => {
console.log('新名字:', newVal)
console.log('旧名字:', oldVal)
})

// 修改name
user.name = '小红'
// 输出:
// 新名字:小红
// 旧名字:小明
</script>

示例 5:精准监听 reactive 多层嵌套属性(getter 函数)

vue
<script setup>
import { reactive, watch } from 'vue'
const user = reactive({ name: '小明', info: { age: 18 } })

watch(() => user.info.age, (newVal, oldVal) => {
console.log('新年龄:', newVal)
console.log('旧年龄:', oldVal)
})

// 修改嵌套属性
user.info.age = 30
// 输出:
// 新年龄:30
// 旧年龄:18
</script>

示例 6:同时监听多个数据源(数组监听源)

vue
<script setup>
import { ref, reactive, watch } from 'vue'
const keyword = ref('')
const user = reactive({ info: { age: 18 } })
const type = ref(1)

watch([keyword, () => user.info.age], ([newKey, newAge], [oldKey, oldAge]) => {
console.log('新关键词:', newKey)
console.log('新年龄:', newAge)
console.log('旧关键词:', oldKey)
console.log('旧年龄:', oldAge)
})

// 修改 keyword
keyword.value = '前端'
// 输出:
// 新关键词:前端
// 新年龄:18
// 旧关键词:''
// 旧年龄:18

// 修改年龄
user.info.age = 22
// 输出:
// 新关键词:前端
// 新年龄:22
// 旧关键词:前端
// 旧年龄:18
</script>

示例 7:flush 配置控制执行时机 post(DOM 更新后执行)

vue
<script setup>
import { ref, watch } from 'vue'
const num = ref(0)

watch(num, (newVal) => {
console.log('DOM更新完成,当前值:', newVal)
}, { flush: 'post' })

num.value = 99
// 等待DOM更新后输出:
// DOM更新完成,当前值:99
</script>

示例 8:手动停止监听

vue
<script setup>
import { ref, watch } from 'vue'
const num = ref(0)

const stopWatch = watch(num, (newVal) => {
console.log('数值变更:', newVal)
})

num.value = 10
// 输出:数值变更:10

// 停止监听
stopWatch()

num.value = 20
// 无任何打印输出
</script>

示例 9:watch 完整配置项(immediate+deep+flush + 调试钩子)

vue
<script setup>
import { reactive, watch } from 'vue'
const user = reactive({ name: '小明', info: { age: 18 } })

watch(
() => user.info.age,
(newVal, oldVal) => {
console.log('新年龄:', newVal)
console.log('旧年龄:', oldVal)
},
{
immediate: true,
deep: false,
flush: 'post',
onTrack(e) {
console.log('调试-收集依赖', e)
},
onTrigger(e) {
console.log('调试-触发监听', e)
}
}
)

// 页面初始化自动输出
// 新年龄:18
// 旧年龄:undefined

user.info.age = 28
// 输出:
// 调试-触发监听 ...
// 新年龄:28
// 旧年龄:18
</script>

示例 10:watchEffect 自动收集依赖(无 oldVal,自带 immediate)

vue
<script setup>
import { ref, reactive, watchEffect } from 'vue'
const num = ref(0)
const user = reactive({ name: '小明' })

watchEffect((onCleanup) => {
console.log('数字:', num.value, '用户名:', user.name)

// 副作用清理函数
onCleanup(() => {
console.log('执行清理操作')
})
})

// 页面初始化自动输出
// 数字:0 用户名:小明

num.value = 50
// 输出:
// 执行清理操作
// 数字:50 用户名:小明

user.name = '小李'
// 输出:
// 执行清理操作
// 数字:50 用户名:小李
</script>

示例 11:watchPostEffect 简写 flush:post

vue
<script setup>
import { ref, watchPostEffect } from 'vue'
const num = ref(0)

watchPostEffect(() => {
console.log('DOM已更新,num值:', num.value)
})

num.value = 100
// DOM更新后输出:
// DOM已更新,num值:100
</script>

示例 12:watchSyncEffect 同步执行 flush:sync

vue
<script setup>
import { ref, watchSyncEffect } from 'vue'
const num = ref(0)

watchSyncEffect(() => {
console.log('同步触发,num值:', num.value)
})

num.value = 88
// 立刻同步输出:
// 同步触发,num值:88
</script>

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/10 13:20:18

5分钟快速上手QModMaster:开源免费的Modbus调试工具终极指南

5分钟快速上手QModMaster&#xff1a;开源免费的Modbus调试工具终极指南 【免费下载链接】qModbusMaster Fork of QModMaster (https://sourceforge.net/p/qmodmaster/code/ci/default/tree/) 项目地址: https://gitcode.com/gh_mirrors/qm/qModbusMaster 你是否曾为工业…

作者头像 李华
网站建设 2026/7/10 13:19:32

PIC单片机项目(1)——基于PIC16F877A的电子秤设计

首先简要描述一下实现的功能&#xff1a;使用电位器&#xff0c;采用电阻分压的形式来改变电阻上的电压&#xff0c;以此来模拟电子秤上重量的变化。使用PIC16F877A的AD转换端口&#xff0c;测量电阻上的电压&#xff0c;用此数据来代替物体重量。同时用LCD1602显示器&#xff…

作者头像 李华
网站建设 2026/7/10 13:19:03

Tailwind CSS在Cursor中失效?3类高频报错深度溯源(class自动补全失灵、@apply不生效、PurgeCSS误删),附官方CLI兼容性修复补丁

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;Cursor中Tailwind CSS失效的典型现象与诊断全景 在 Cursor 编辑器中集成 Tailwind CSS 后&#xff0c;开发者常遭遇样式未生效、类名无法智能补全、热重载失灵等“静默失效”问题。这类问题往往不抛出编译错误…

作者头像 李华
网站建设 2026/7/10 13:16:04

番茄小说下载神器:打造个人专属数字图书馆的终极解决方案

番茄小说下载神器&#xff1a;打造个人专属数字图书馆的终极解决方案 【免费下载链接】fanqienovel-downloader 下载番茄小说 项目地址: https://gitcode.com/gh_mirrors/fa/fanqienovel-downloader 还在为网络不稳定而错过精彩小说章节烦恼吗&#xff1f;想要随时随地畅…

作者头像 李华
网站建设 2026/7/10 13:15:13

回溯题目:字母组合迭代器

文章目录题目标题和出处难度题目描述要求示例数据范围解法思路和算法代码复杂度分析题目 标题和出处 标题&#xff1a;字母组合迭代器 出处&#xff1a;1286. 字母组合迭代器 难度 5 级 题目描述 要求 设计 CombinationIterator\texttt{CombinationIterator}Combinatio…

作者头像 李华
网站建设 2026/7/10 13:13:21

gitlab 服务 CI/CD 配置

使用Gitlab作为工作仓库进行代码发布及版本控制&#xff0c;Gitlab内置了CI/CD的工具&#xff0c;这些工具可以用于代码提交的同时完成镜像构建、自动化测试、自动化部署等连续的工作&#xff1a; CI: Continuous Integration&#xff08;持续集成&#xff09;CD: Continuous …

作者头像 李华