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

vue2和vue3的watch用法

  在Vue 2和Vue 3中,watch用于监听响应式数据的变化并执行副作用逻辑。两者核心功能一致,但Vue 3在组合式API中提供了更灵活的用法,并支持TypeScript类型推断。以下是详细对比和示例:


1. Vue 2 的 watch 选项

  在Vue 2中,watch是一个选项,用于监听datacomputed中的属性变化。
基本语法

export default {data() {return { count: 0 };},watch: {count(newValue, oldValue) {console.log(`count changed from ${oldValue} to ${newValue}`);}}
};

关键特性

  • 监听单个属性时,回调函数接收(newValue, oldValue)参数。
  • 监听对象或数组时,默认是浅监听(需深度监听需设置deep: true)。
  • 立即执行回调需设置immediate: true

深度监听示例

watch: {user: {handler(newValue, oldValue) {console.log('user changed:', newValue);},deep: true, // 深度监听对象内部变化immediate: true // 立即执行一次}
}

2. Vue 3 的 watch(选项式API)

  Vue 3的选项式API中,watch的用法与Vue 2几乎一致。
示例

import { defineComponent } from 'vue';
export default defineComponent({data() {return { count: 0 };},watch: {count(newValue, oldValue) {console.log(`count changed from ${oldValue} to ${newValue}`);}}
});

3. Vue 3 的 watch(组合式API)

  Vue 3的组合式API中,watch通过函数形式导入,支持更灵活的监听逻辑(如监听多个源、计算属性等)。
基本语法

import { ref, watch } from 'vue';
export default {setup() {const count = ref(0);watch(count, (newValue, oldValue) => {console.log(`count changed from ${oldValue} to ${newValue}`);});return { count };}
};

关键特性

  • 监听单个响应式源:直接传入Refreactive对象。
  • 监听多个源:传入数组。
  • 立即执行:通过{ immediate: true }选项。
  • 深度监听:默认对对象是浅监听,需显式设置{ deep: true }

监听多个源示例

import { ref, watch } from 'vue';
export default {setup() {const count = ref(0);const name = ref('');watch([count, name], ([newCount, newName], [oldCount, oldName]) => {console.log(`count: ${oldCount} -> ${newCount}, name: ${oldName} -> ${newName}`);});return { count, name };}
};

监听计算属性或复杂逻辑

import { ref, computed, watch } from 'vue';
export default {setup() {const count = ref(0);const doubleCount = computed(() => count.value * 2);watch(doubleCount, (newValue) => {console.log('doubleCount changed:', newValue);});return { count };}
};

4. watchEffect(Vue 3特有)

  Vue 3引入了watchEffect,它会自动追踪回调中用到的响应式依赖,无需显式声明监听目标。
示例

import { ref, watchEffect } from 'vue';
export default {setup() {const count = ref(0);watchEffect(() => {console.log(`count is now: ${count.value}`);});return { count };}
};

watch的区别

  • watchEffect无需指定监听目标,自动追踪依赖。
  • 回调中用到的所有响应式变量变化时都会触发。
  • 无法获取旧值(oldValue)。

5. TypeScript支持(Vue 3)

  Vue 3的组合式API对TypeScript支持更好,可以显式声明监听数据的类型。
示例

import { ref, watch } from 'vue';
export default {setup() {const count = ref<number>(0);watch(count, (newValue, oldValue) => {console.log(`count changed from ${oldValue} to ${newValue}`);});return { count };}
};

6. 性能优化对比

特性Vue 2Vue 3(选项式API)Vue 3(组合式API)
监听单个属性watch选项同Vue 2watch(ref, callback)
监听多个属性需手动合并逻辑同Vue 2watch([ref1, ref2], callback)
深度监听deep: true同Vue 2{ deep: true }选项
立即执行immediate: true同Vue 2{ immediate: true }选项
自动依赖追踪不支持不支持watchEffect
TypeScript支持需额外类型声明同Vue 2内置类型推断,支持显式类型声明

7. 最佳实践建议

  1. 简单监听:Vue 2/Vue 3选项式API的watch选项足够。
  2. 复杂逻辑:Vue 3组合式API的watch更灵活(如监听多个源、计算属性)。
  3. 自动依赖追踪:优先使用watchEffect(适合无旧值需求的场景)。
  4. TypeScript项目:Vue 3组合式API能提供更好的类型安全。

完整示例对比

Vue 2 监听对象深度变化

export default {data() {return { user: { name: 'Alice', age: 25 } };},watch: {user: {handler(newVal, oldVal) {console.log('user changed:', newVal);},deep: true,immediate: true}}
};

Vue 3 组合式API等价实现

import { reactive, watch } from 'vue';
export default {setup() {const user = reactive({ name: 'Alice', age: 25 });watch(() => user,(newVal, oldVal) => {console.log('user changed:', newVal);},{ deep: true, immediate: true });return { user };}
};
http://www.dtcms.com/a/406023.html

相关文章:

  • 【Python】文件处理(二)
  • 幸运飞艇网站建设设计网站流程
  • 基于vue的考研信息系统6kv17(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末
  • 针对单元测试、集成测试、系统测试和验收测试(用户测试)各自的目标和测试内容不同,设计对应的各类测试用例
  • (JDK,Eclipse,Tomcat版本)Java的web配置Part1 (#by 拌面
  • 中企动力算大厂吗周口网站关键词优化
  • 用 Flink DataStream API 搭建流式 ETL从无状态到有状态、从单流到连接流
  • 上海保洁服务网站建设小网站如何做密码找回
  • FreeRTOS内存管理
  • 基于 STM32 的智能洗衣机控制系统设计与实现
  • 【开题答辩全过程】以 IT项目需求发布与管理平台为例,包含答辩的问题和答案
  • 省级旅投集团数据中台架构实战:多租户隔离与主题域建模实践
  • 分布式阳台光伏系统组成及防逆流电表功能详解
  • PostgreSQL 和 MySQL两个数据库的索引的区别
  • 论文流程1
  • 苏州正规制作网站公司去了外包简历就毁了吗
  • 上海网站建设公司哪家好?大淘客怎么自己做网站
  • 解决Markdown笔记图片失效问题:Gitee+PicGo图床搭建全攻略
  • AWS中国云中的ETL之从aurora搬数据到s3(Glue版)
  • 忘记云服务器密码怎么办?阿里云/腾讯云/AWS密码重置官方指南
  • DevOps实战(9) - 使用Arbess+GitPuk+sourcefare+PostIn搭建Java自动化部署
  • 嘉兴优化网站价格怎么做网站xml地图
  • C语言指针深度解析:从硬件架构到现代安全编程
  • Vue 自定义指令详解
  • uniapp 支付宝小程序 扩展组件 component 节点的class不生效
  • 盈利的网站网站开发还找到工作吗
  • 智能体:小白零基础入门第三期,使用 Coze 搭建一款智能语音听写助手(附喂饭级教程)
  • Vue3 + TypeScript + Ant Design Vue 实现左侧菜单动态配置与路由跳转(支持路由选中项同步 + 自动展开父菜单)
  • uniapp项目使用字体图标
  • 前端拖拽,看似简单,其实处处是坑