Vue 中 `watch` 与 `this.$watch` 使用指南

Vue 中 watchthis.$watch 使用指南

在 Vue 开发中,我们经常会遇到这样的需求:当某个数据发生变化时,自动执行一些操作 ,比如一个下拉框选了"学生",另一个输入框就自动禁用;或者用户修改了某项信息后,自动保存草稿。

这时,我们就需要用到 Vue 的数据监听机制 ------watchthis.$watch

它们都能实现"监听变化 → 做点事情"的功能,但用法和适用场合略有不同。下面用通俗易懂的方式讲清楚:


一、watch:写在组件里的"固定监听器"

✅ 功能

watch 是你在写 Vue 组件时,直接在配置对象里写的一个选项。它会在组件创建时自动生效,持续监听你指定的数据。

✅ 写法示例

js 复制代码
export default {
  data() {
    return { userType: 'guest' };
  },
  watch: {
    userType(newVal, oldVal) {
      console.log('用户类型变了!', newVal);
      this.isEmployeeFieldDisabled = (newVal !== 'employee');
    }
  }
}

✅ 适用场景

  • 你一开始就知道要监听哪个字段(比如表单里 A 字段变了,B 字段要联动)。
  • 监听的是 datapropscomputed,而且整个组件生命周期都需要监听。
  • 逻辑简单、稳定、不会中途关闭

💡 举个实际例子:你在做一个个人信息页,当"身份类型"从"员工"变成"访客"时,自动禁用"工号"输入框 ------ 这种固定的联动关系,用 watch 最合适。


二、this.$watch:运行时动态创建的"临时监听器"

✅ 功能

this.$watch 是一个方法 ,你可以在组件的任何地方(比如 mounted、某个点击事件里)调用它,动态开启一个监听器。它会返回一个"取消函数",你可以随时手动关掉它。

✅ 写法示例

js 复制代码
export default {
  mounted() {
    // 动态监听
    this.unwatch = this.$watch('user.profile.level', (newVal) => {
      console.log('用户等级变了:', newVal);
    });
  },
  methods: {
    stopWatching() {
      if (this.unwatch) this.unwatch(); // 手动取消监听
    }
  }
}

✅ 适用场景

  • 不知道一开始要不要监听,等某个条件满足后才开始监听(比如点了"高级模式"才监听调试字段)。
  • 需要临时监听,用完就关,避免副作用或重复触发。
  • 监听的字段名是动态生成的(比如循环遍历一堆字段名,逐个监听)。

💡 举个例子:你有一个复杂的表单,只有当用户勾选"启用自定义规则"后,才开始监听"规则表达式"字段的变化,并实时校验语法 ------ 这时候用 this.$watch 更灵活。


三、核心区别对比

特点 watch(选项) this.$watch(方法)
写在哪 组件配置对象里(声明式) 在方法/生命周期里调用(命令式)
什么时候生效 组件创建时自动生效 调用时才开始监听
能取消吗 不能手动取消(组件销毁时自动清理) ✅ 可以拿到取消函数,随时关掉
适合监听 固定、长期的字段 动态、临时、条件性的监听
代码可读性 高(集中管理) 灵活但分散

四、我该怎么选?------ 自查清单

当你想监听一个数据变化时,问自己三个问题:

  1. 这个监听逻辑是不是从组件一加载就需要?

    → 是 👉 用 watch

    → 否 👉 考虑 this.$watch

  2. 我是否可能在中途"关掉"这个监听?

    → 需要关 👉 用 this.$watch(拿到取消函数)

    → 一直开着 👉 用 watch

  3. 要监听的字段名是写死的,还是动态算出来的?

    → 写死的(如 userType)👉 watch

    → 动态的(如 formData[fieldName])👉 this.$watch

大多数表单联动、字段格式化、展示逻辑的场景(比如你开发的个人信息页),直接用 watch 就够了,简单又可靠。

⚙️ 只有当你需要"按需开启/关闭监听"或"监听动态路径"时,才需要用到 this.$watch


总结一句话:

watch 是"常驻保安",一上岗就一直盯着;
this.$watch 是"临时特工",召之即来,挥之即去。

根据你的需求选对工具,代码会更清晰、更安全!

相关推荐
假装我不帅10 小时前
jquery-validation使用
前端·javascript·jquery
怕浪猫10 小时前
React从入门到出门第六章 事件代理机制与原生事件协同
前端·javascript·react.js
天府之绝10 小时前
uniapp 中使用uview表单验证时,自定义扩展的表单,在改变时无法触发表单验证处理;
开发语言·前端·javascript·vue.js·uni-app
be or not to be10 小时前
Html-CSS动画
前端·css·html
初恋叫萱萱10 小时前
技术基石与职场进阶:构建从Web后端到高性能架构的完整知识图谱
前端·架构·知识图谱
木木木一10 小时前
Rust学习记录--C9 错误处理
前端·学习·rust
局外人LZ10 小时前
libsodium.js:web端与 Node.js 的现代加密工具集,构建前端安全加密体系
前端·javascript·node.js
xkxnq10 小时前
第二阶段:Vue 组件化开发(第 20天)
前端·javascript·vue.js
哈__10 小时前
React Native 鸿蒙跨平台开发:Keyboard 键盘控制
javascript·react native·react.js
「、皓子~10 小时前
AI 创作系列(34)海狸IM桌面版 v1.1 正式发布:Vite + Electron 性能优化与体验升级
前端·人工智能·electron·开源·开源软件·im