【Vue】watch与$watch使用详解

配置项

vue-watch 有两个可配置项 deepimmediate,分别表示是否深度监听及是否立即调用

定义形式

监听目标 key

监听目标 的定义形式包括:普通key字符串函数仅 $watch

  1. 普通key:name: function() {}name(){}
  2. 字符串:监听具体深层属性 a.b.c、监听当前路由信息 $route
  3. 函数:仅可在 $witch 中定义,可同时监听多个数据变化,可以通过监听 computed 的返回值来达到同样的效果

响应事件 value

响应事件 的定义形式包括:函数对象字符串数组

  1. 函数:接受两个参数:新数据旧数据
  2. 对象:可定义三个属性,handlerdeepimmediatehandler 为数据变化后的回调函数,后两者为配置项
  3. 字符串:设置回调为 methods 中的同名方法
  4. 数组:元素为上述三种形式,数据变化时会依次触发

示例

watch选项

var vm = new Vue({
  data: {
    a: 1,
    b: 2,
    c: 3,
    d: 4,
    e: {
      f: {
        g: 5
      }
    }
  },
  watch: {
	newA(val, oldVal) {
		console.log('监听computed的值实现监听多个数据变化', val, oldVal)
	},
    a: function (val, oldVal) {
      console.log('new: %s, old: %s', val, oldVal)
    },
    // methods选项中的方法名
    b: 'someMethod',
    // 深度侦听,该回调会在任何被侦听的对象的 property 改变时被调用,不论其被嵌套多深
    c: {
      handler: function (val, oldVal) { /* ... */ },
      deep: true
    },
    // 该回调将会在侦听开始之后被立即调用
    d: {
      handler: 'someMethod',
      immediate: true
    },
    // 调用多个回调
    e: [
      'handle1',
      function handle2 (val, oldVal) { /* ... */ },
      {
        handler: function handle3 (val, oldVal) { /* ... */ },
        immediate: true
      }
    ],
    // 侦听表达式
    'e.f': function (val, oldVal) { /* ... */ }
  },
  computed: {
  	newA() {
  		return this.a + this.b;
  	}
  }
})

$watch实例方法

$watch 返回一个取消观察函数,用来停止触发回调

let unwatch = vm.$watch(
  function () {
    // 表达式 `this.a + this.b` 每次得出一个不同的结果时
    // 处理函数都会被调用。
    // 这就像监听一个未被定义的计算属性
    return this.a + this.b
  },
  function (newVal, oldVal) {
    // 做点什么
  },{ // 三参为配置对象
  	deep: true
  }
)

unwatch(); // 停止监听

监听多个数据变化

  1. watch中通过监听 computed 实现
  2. vm.$watch 中通过一参传入函数实现
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3中的`watch`与Vue2中的`watch`有一些重要的变化。在Vue3中,`watch`仍然允许我们监视响应式数据的变化,并对变化做出相应的操作。不过,Vue3引入了一个新的API——`watchEffect`来取代Vue2中的`watch`。 在Vue3中,`watch`可以通过以下几种方式使用: 1. **基础用法**:可以使用`watch`方法来监视一个响应式数据的变化,并在变化发生时执行回调函数。示例如下: ```javascript import { watch } from 'vue'; watch(() => { // 监视的响应式数据 return state.value; }, (newVal, oldVal) => { // 响应式数据发生变化时执行的回调函数 console.log(`new value: ${newVal}, old value: ${oldVal}`); }); ``` 2. **立即执行**:可以通过在`watch`选项中设置`immediate`为`true`,使得监听函数会在初始创建时立即执行一次。示例如下: ```javascript watch(() => { // 监视的响应式数据 return state.value; }, (newVal, oldVal) => { // 响应式数据发生变化时执行的回调函数 console.log(`new value: ${newVal}, old value: ${oldVal}`); }, { immediate: true }); ``` 3. **深度监听**:可以通过设置`deep`为`true`来进行深度监听,以便检测对象内部值的变化。示例如下: ```javascript watch(() => { // 监视的响应式数据 return state.obj; }, (newVal, oldVal) => { // 响应式数据发生变化时执行的回调函数 console.log(`new value: ${newVal}, old value: ${oldVal}`); }, { deep: true }); ``` 此外,Vue3还引入了`watchEffect`,它可以轻松地监视响应式数据的变化,并在其变化时执行回调函数。与`watch`不同的是,`watchEffect`不需要显式指定要监视的数据,它会自动追踪代码中使用的响应式数据,并在其变化时触发。示例如下: ```javascript import { watchEffect } from 'vue'; watchEffect(() => { // 使用到的响应式数据 console.log(state.value); }); ``` 需要注意的是,在Vue3中,`watch`和`watchEffect`都是基于副作用函数实现的,所以它们可以在组件渲染期间多次执行。 以上是Vue3中`watch`和`watchEffect`的详细说明,希望能对你有所帮助!如有其他问题,请继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值