Bootstrap

Vue-watch 侦听器

定义

在官方文档里面是这么定义的

就是说当属性变化的时候,我们能通过 watch 来监听到属性的变化,从而来执行异步操作或者是耗费性能的操作 

常见使用 

1、首先,侦听器也是一个配置对象,可以监听多个属性的改变。

2、键就是需要监听的属性,值也同时是一个对象,既可以是data中的属性,也可以是计算属性

3、对象内部存在几个常用的属性和方法( handler () {}deep、immediate)

4、handler () {} :就是监听函数,能接收两个参数,一个是 newValue ,一个是oldValue

5、deep :如果监听的属性值是一个对象,可以在选项参数中指定 deep: true。注意监听数组的变更不需要这么做。

6、immediate:在选项参数中指定 immediate: true 将立即以表达式的当前值触发回调

默认版本

此时在组件初始化挂载之后,发现第一次是没有触发侦听动作的,所以是没有打印出参数

const vm = new Vue({
  el: '#root',
  data() {
    return {
      isHot: true,
    }
  },
  methods: {
    changeWeather() {
      this.isHot = !this.isHot
    }
  },
  watch: {
    isHot: {
      handler(newValue , oldValue) {
        console.log(newValue , oldValue)
        console.log('isHot被修改了')
      }
    }
  }
})

 但是当我点击按钮之后,此时 isHot 发生了改变,侦听器触发,执行了 handler ,打印参数

简写版本 

如果你确定不需要配置其他两个选项,那么,可以写成类似 computed 的简写方式,直接写成函数方式,来实现监听动作。函数名就是监听属性,函数体就是 响应的 handler

watch: {
  isHot(newValue, oldValue) {
    console.log(newValue, oldValue)
    console.log('isHot被修改了')
  }
}

 deep:如果监听的属性值是一个对象,可以在选项参数中指定 deep: true。(深度监听)

同样是上面的例子,将 isHot 改成了一个对象,来看看是什么情况。

const vm = new Vue({
  el: '#root',
  data() {
    return {
      isHot: {
        a: 1,
        b: 2
      },
    }
  },
  methods: {
    changeWeather() {
      this.isHot.a = 111
    }
  },
  watch: {
    isHot: {
      handler(newValue , oldValue) {
        console.log(newValue , oldValue)
        console.log('isHot被修改了')
      },
      // deep: true,
    }
  }
})

 初始化之后,发现控制台上是没有打印参数的,和之前简化版一样。此时点击按钮,发现控制台任然没有输出。

然后放开 deep:true 之后,初始化还是没有参数的,点击按钮之后,控制台打印参数了

 文档里面说,deep:true 是用来监听对象内部的改变,数组是不用开启的,那我们来看看到底是啥

将 isHot 改为 数组

data() {
  return {
    isHot: [1, 2, 3]
  }
},

然后在不开启 和 开启 deep:true 的时候,分别看看是什么情况

 结果证明,在开启和不开启的时候,控制台都是同样的结果,都只有在点击按钮之后,才会触发侦听动作

immediate:在选项参数中指定 immediate: true 将立即以表达式的当前值触发回调

初始化之后,因为设置了 immediate :true 所以在组件第一次挂载之后,就会立即触发侦听效果,执行 handler 函数,此时可以看到 newValue 是初始化值,oldValue是 undefined

完整版 :确定需要配置其他两个属性

 设置  isHot 为json 对象,deep:true, immediate: true

const vm = new Vue({
  el: '#root',
  data() {
    return {
      isHot: {
        a: 1,
        b: 2
      }
    }
  },
  methods: {
    changeWeather() {
      this.isHot = {
        a: 111,
        b: 222
      }
    }
  },
  watch: {
    isHot: {
      handler(newValue, oldValue) {
        console.log(newValue, oldValue)
        console.log('isHot正在被侦听')
      },
      deep: true,
      immediate: true
    }
  }
})

在初始化时,就能看到控制台已经打印了当前的参数和提示信息,代表 handler 已经触发。

在点击按钮之后,看到了 newValue 和 oldValue的两个新的值,

 这就解释了上面的各个属性的作用

 侦听计算属性

const vm = new Vue({
  el: '#root',
  data() {
    return {
      isHot: true
    }
  },
  computed: {
    info() {
      return this.isHot ? '热' : '冷'
    }
  },
  methods: {
    changeWeather() {
      this.isHot = !this.isHot
    }
  },
  watch: {
    info: {
      handler(newValue, oldValue) {
        console.log(newValue, oldValue)
        console.log('info正在被侦听')
      },
      deep: true,
      immediate: true
    }
  }
})

 初始化页面控制台输出

点击按钮之后控制台输出

 

 可以看到,计算属性更改之后,侦听器也同步触发了。

 通过实例监测

侦听存在两种情况

1、明确的知道需要侦听哪个属性,可以直接写在 new Vue () 中,通过 watch 进行侦听

2、可以在Vue实例中,通过vm.$watch('属性',{配置对象}) 来侦听属性,通过 vm.$watch() 侦听的属性,配置对象,就和在 new Vue() 中 的配置一样 包含上面说的两个属性,一个方法

const vm = new Vue({
  el: '#root',
  data() {
    return {
      isHot: true
    }
  },
  computed: {
    info() {
      return this.isHot ? '热' : '冷'
    }
  },
  methods: {
    changeWeather() {
      this.isHot = !this.isHot
    }
  },
})

vm.$watch('isHot', {
  handler(newValue, oldValue) {
    console.log(newValue, oldValue)
    console.log('isHot正在被侦听')
  },
  deep: true,
  immediate: true
})

 在初始化和点击按钮之后分别是如下输出

 本章总结

 1、当被监视的属性变化时,回调函数自动调用

2、监视属性必须存在,才能进行监视(data内的属性,计算属性等)

3、监视容器的两种写法:new Vue () 的时候写入 watch 配置、通过实例 vm.$watch('侦听属性',{传入配置})

;