vue 的watch用法

  参考转自https://www.imooc.com/article/details/id/28187vue

  类型:{ [key: string]: string | Function | Object | Array }数组

  详细:一个对象,键是须要观察的表达式,值是对应回调函数。值也能够是方法名,或者包含选项的对象。Vue 实例将会在实例化时调用 $watch(),遍历 watch 对象的每个属性。app

  备注:watch主要用于监控vue实例的变化函数

1、简单应用

<div>
      <p>FullName: {{fullName}}</p>
      <p>FirstName: <input type="text" v-model="firstName"></p>
</div>
 
new Vue({
  el: '#root',
  data: {
    firstName: 'Dawei',
    lastName: 'Lou',
    fullName: ''
  },
  watch: {
    firstName(newName, oldName) {
      this.fullName = newName + ' ' + this.lastName;
    }
  } 
})

  上面的代码的效果是,当咱们输入firstName后,wacth监听每次修改变化的新值,而后计算输出fullNamethis

2、高级应用

  2.1 handler方法和immediate属性

  watch 的一个特色是,最初绑定的时候是不会执行的,要等到 firstName 改变时才执行监听计算。那咱们想要一开始就让他最初绑定的时候就执行改怎么办呢?咱们须要修改一下咱们的 watch 写法,修改事后的 watch 代码以下:spa

watch: { 
firstName: { handler(newName, oldName) {
this.fullName = newName + ' ' + this.lastName; }, // 表明在wacth里声明了firstName这个方法以后当即先去执行handler方法 immediate: true
} }

  注意到handler了吗,咱们给 firstName 绑定了一个handler方法,以前咱们写的 watch 方法其实默认写的就是这个handler,Vue.js会去处理这个逻辑,最终编译出来其实就是这个handlercode

  而immediate:true表明若是在 wacth 里声明了 firstName 以后,就会当即先去执行里面的handler方法,若是为 false就跟咱们之前的效果同样,不会在绑定的时候就执行。对象

  2.2 deep属性

  watch 里面还有一个属性 deep,默认值是 false,表明是否深度监听, 在data数据里有对象Object,对象里面的数据没法监听到,这时候就须要深度监听。blog

  数组(一维、多维)的变化不须要经过深度监听,对象数组中对象的属性变化则须要deep深度监听。作用域

<div>
      <p>obj.a: {{obj.a}}</p>
      <p>obj.a: <input type="text" v-model="obj.a"></p>
</div>
 
new Vue({
  el: '#root',
  data: {
    obj: {
      a: 123,
      b: 'hellow',
      c: 'world'    
    }
  },
  watch: { 
    obj: { //这是对obj的全面监控,里面任意的改变都会触发watch监控。
      handler(newName, oldName) {
         console.log('obj changed');
      },
      immediate: true,
      deep: true
    },
    'obj.a': { //这是对obj.a的监控,obj.a改变触发watch监控。键路径必须加上引号
      handler(newName, oldName) {
         console.log('obj.a changed');
      },
      immediate: true,
      deep: true
    } 
  } 
})
vm.$watch("obj",function(val,oldval){
  console.log(val)
})
//主动调用$watch方法来进行数据监测
  2.3 注销watch

  为何要注销 watch?由于咱们的组件是常常要被销毁的,好比咱们跳一个路由,从一个页面跳到另一个页面,那么原来的页面的 watch 其实就没用了,这时候咱们应该注销掉原来页面的 watch 的,否则的话可能会致使内置溢出。好在咱们平时 watch 都是写在组件的选项中的,他会随着组件的销毁而销毁

 可是,若是咱们使用下面这样的方式写 watch,那么就要手动注销了,这种注销其实也很简单
//watch注销
const unWatch = app.$watch('text', (newVal, oldVal) => {
  console.log(`${newVal} : ${oldVal}`);
})

unWatch(); // 手动注销watch

  app.$watch调用后会返回一个值,就是unWatch方法,你要注销 watch 只要调用unWatch方法就能够了。

  注意,不该该使用箭头函数来定义 watcher 函数 (例如 searchQuery: newValue => this.updateAutocomplete(newValue))。理由是箭头函数绑定了父级做用域的上下文,因此 this 将不会按照指望指向 Vue 实例,this.updateAutocomplete 将是 undefined。

相关文章
相关标签/搜索