在 Vue.js 2 中,watch 是一个用来观察和响应 Vue 实例数据变动的选项。它可以用来监听数据的变化并执行相应的逻辑,比如在数据变化时更新界面或者执行一些异步操作。

基本用法

监听单个数据源

最简单的用法是监听单个数据源(即一个数据属性)的变化:

new Vue({
  data: {
    message: 'Hello, Vue.js!'
  },
  watch: {
    message: function(newVal, oldVal) {
      console.log(`message 从 ${oldVal} 变为 ${newVal}`);
    }
  }
});
监听多个数据源

你也可以同时监听多个数据源,将 watch 中的键值对扩展为多个属性:

new Vue({
  data: {
    firstName: 'John',
    lastName: 'Doe',
    fullName: 'John Doe'
  },
  watch: {
    firstName: function(newVal, oldVal) {
      this.fullName = newVal + ' ' + this.lastName;
    },
    lastName: function(newVal, oldVal) {
      this.fullName = this.firstName + ' ' + newVal;
    }
  }
});

这时候打印的newval和oldval是不一样的。因为他是单个数据源。当我们监听对象里面的属性时就发现了不同了。

高级用法

深度监听对象或数组的变化

当需要监听对象或数组内部属性的变化时,可以设置 deep: true

new Vue({
  data: {
    user: {
      name: 'John',
      age: 30
    }
  },
  watch: {
    user: {
      handler: function(newVal, oldVal) {
        console.log('user 对象发生变化',newVal, oldVal);
      },
      deep: true
    }
  }
});

这时候打印的newVal, oldVal其实是一样的,而且必须加上deep:true。要不然即使对象里面属性改变handler函数也是不执行的。可以去掉试试。

使用 deep: true 可以深度遍历对象内部的属性,当任意属性发生变化时都会触发 watch 的处理函数。

娜娜娜娜,我们yao监听对象里的属性怎么办,只想其中的属性改变时执行某个方法怎么办,

see👇

 监听对象里的属性

new Vue({
  data: {
    user: {
      name: 'John',
      age: 30,
      type: 30,
    }
  },
  watch: {
    'user.type': {
      handler(newVal, oldVal) {
        // 打印旧值和新值
        console.log('旧值:', oldVal, '新值:', newVal);
        // 执行相关操作
        if (newVal !== oldVal) {
          // this.updateStyle();
          this.addMapServer(newVal);
        }
      },
      immediate: true // 立即执行一次监听函数
    }
  }
});

立即触发监听函数

可以通过设置 immediate: true 来立即触发监听函数,即在初始化时立即执行一次监听函数:

new Vue({
  data: {
    count: 0
  },
  watch: {
    count: {
      handler: function(newVal, oldVal) {
        console.log(`count 的值变为 ${newVal}`);
      },
      immediate: true
    }
  }
});
如果要监听对象里面多个属性变化

你可以使用计算属性来派生新的数据,然后通过 watch 特性来监听这个计算属性的变化。

computed: {
comSetView() {
      return `${this.option.lng},${this.option.lat},${this.option.height},${this.option.pitchRadiu}`;
    }
}


 watch: {
 comSetView: {
        deep: true,
        handler(){
          this.metSetView()
        }
    },
}

这样就不用一个一个属性的拆开写了

移除监听

如果需要在组件销毁时移除 watch,可以通过 vm.$watch 返回的函数来移除监听:

var unwatch = vm.$watch('expression', callback);

// 在适当的时机移除监听
unwatch();

GitHub 加速计划 / vu / vue
80
16
下载
vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。
最近提交(Master分支:4 个月前 )
73486cb5 * chore: fix link broken Signed-off-by: snoppy <michaleli@foxmail.com> * Update packages/template-compiler/README.md [skip ci] --------- Signed-off-by: snoppy <michaleli@foxmail.com> Co-authored-by: Eduardo San Martin Morote <posva@users.noreply.github.com> 6 个月前
e428d891 Updated Browser Compatibility reference. The previous currently returns HTTP 404. 6 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐