zoukankan      html  css  js  c++  java
  • vue 的watch用法

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

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

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

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

    一、简单应用

    <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监听每次修改变化的新值,然后计算输出fullName

    二、高级应用

      2.1 handler方法和immediate属性

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

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

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

      而immediate:true代表如果在 wacth 里声明了 firstName 之后,就会立即先去执行里面的handler方法,如果为 false就跟我们以前的效果一样,不会在绑定的时候就执行。

      2.2 deep属性

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

      数组(一维、多维)的变化不需要通过深度监听,对象数组中对象的属性变化则需要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。

     



  • 相关阅读:
    年终总结 2016-08-28 22:04 422人阅读 评论(26) 收藏
    [mysql]MySQL Daemon failed to start 2016-08-14 21:27 1121人阅读 评论(18) 收藏
    solrr初步了解 2016-07-31 22:29 380人阅读 评论(4) 收藏
    基于spring-boot的测试桩设计--几种常见的controller
    利用Factory-boy和sqlalchemy来批量生成数据库表数据
    job中shell脚本异常(删除不存在容器),导致job被打断执行的问题 脚本优化方法
    利用Factory-boy来生成实例数据
    pytest相关资源收集
    pytest 用 @pytest.mark.usefixtures("fixtureName")装饰类,可以让执行每个case前,都执行一遍指定的fixture
    pytest fixture 利用 params参数实现用例集合
  • 原文地址:https://www.cnblogs.com/aidixie/p/10383968.html
Copyright © 2011-2022 走看看