当前位置: 首页 > news >正文

【vue3】watch、watchEffect、watchPostEffect和watchSyncEffect的区别详解

watch

监听属性变化

<template><button @click="handleClick">add</button>
</template><script lang="ts" setup>
const number = ref(1);
const handleClick = () => {number.value++;
};watch(() => number.value,(newVal, oldValue) => {console.log(newVal, "数据变化了");},
);
</script>

watchEffect

自动追踪依赖的副作用

与wacth区别相当于加{immediate: true}

<template><button @click="handleClick">add</button>
</template><script lang="ts" setup>
const number = ref(1);
const handleClick = () => {number.value++;
};watch(() => number.value,(newVal, oldValue) => {console.log(newVal, "数据变化了");},{ immediate: true }
);
watchEffect(()=>{consloe.log(number.value,"数据变化了")
})
</script>

watchPostEffect

dom更新完执行

相当于watch加{ immediate: true , flush: 'post'}

<template><button @click="handleClick">add</button>
</template><script lang="ts" setup>
const number = ref(1);
const handleClick = () => {number.value++;
};watch(() => number.value,(newVal, oldValue) => {console.log(newVal, "数据变化了");},{ immediate: true, flush: "post" }
);
// 等同于
watchEffect(() => {console.log(number.value, "数据变化了");// 清理函数示例(组件卸载或依赖变化前执行)return () => {console.log("清理副作用");};},{ flush: "post" }
);
</script>

watchSyncEffect

数据变化立马执行

相当于watch加{ immediate: true, flush: "sync" }

<template><button @click="handleClick">add</button>
</template><script lang="ts" setup>
const number = ref(1);
const handleClick = () => {number.value++;
};watch(() => number.value,(newVal, oldValue) => {console.log(newVal, "数据变化了");},{ immediate: true, flush: "sync" }
);
// 等同于
watchEffect(()=>{console.log(number.value, "数据变化了");
}, {flush: 'sync'
})
</script>

区别

特性watchwatchEffectwatchPostEffectwatchSyncEffect
监听源需手动指定自动追踪依赖自动追踪依赖自动追踪依赖
初始化执行默认不执行(可配置)立即执行立即执行立即执行
新旧值获取可以不可以不可以不可以
执行时机DOM 更新前DOM 更新前DOM 更新后同步执行(阻塞 DOM)
适用场景需精确控制监听源和值对比多依赖副作用,无需值对比依赖 DOM 更新的副作用需同步执行的特殊场景

建议

  1. 需明确监听源、需要新旧值对比 → 使用 watch
  2. 多依赖自动追踪、无需值对比 → 使用 watchEffect
  3. 依赖 DOM 更新后的状态 → 使用 watchPostEffect
  4. 必须同步执行副作用 → 使用 watchSyncEffect(谨慎使用)
http://www.dtcms.com/a/414307.html

相关文章:

  • 【仿生机器人】核心采购清单 (仿生机器人头项目)
  • 云服务器 + Jenkins 实现项目自动化部署与上线
  • wordpress调用当前年份的7种方式
  • 通用性AI大模型辅助本科机器人课程完成编程项目的可靠性分析
  • 使用 EMQX 社区版 v5.8.7 将 MQTT 消息持久化到 MySQL 数据库的实践指南
  • MATLAB中的Excel文件操作:从入门到精通
  • SpringMVC 入门:核心概念与第一个 HelloWorld 案例
  • 山东省建设厅继续教育网站网站做商标在那类
  • 【Linux网络】Socket编程:UDP网络编程实现DictServer
  • 虚拟空间可以做视频网站么删除重装wordpress
  • 【Agent】在基于WSL2的Linux的ALSA输出音频
  • LeetCode:68.寻找两个正序数组的中位数
  • 在 Unity 中使用 SoundTouch 插件控制音频倍速播放
  • 通过keepalived搭建MySQL双主模式的MySQL集群
  • MySQL压缩表创建指南
  • 简述网站的建站流程做一个旅游团网站怎么做
  • ApplicationContext接口实现(三)
  • 英文版网站建设的意义网站怎么做友链
  • 第5章:前后端编码规范
  • Java实现文件下载
  • Python api示例
  • StarRocks:Connect Data Analytics with the World
  • deepseek Kotlin Channel 详细学习指南
  • 网站市场推广东莞 网站制作
  • 面试题回顾
  • Visual Studio 2026 IDE发布了
  • 在MCUXpresso IDE中建立使用静态库的工程
  • 【人工智能通识专栏】第二十八讲:IDE集成Deepseek
  • 电子商务网站建设参考书软文时光发稿平台
  • Flask与Django:Python Web框架的哲学对决