Vue监听(只监听一次)、深度监听、立即执行

监听、只监听一次

  • 如下是我们常用的声明式(监听):
export default{
  data: {
    isReady: false
  },
  watch: {
    isReady(newValue, oldValue) {
      console.log(newValue)
    }
  }
}
  • vue 的 watch 除了可以使用声明式的配置项以外,还可以通过命令式 this.$watch 方法。
  • 如下是我们比较少用的命令式(想要初始只监听一次,必须命令式写法):
export default {
  data: {
    isReady: false
  },
  mounted() {
    this.$watch('isReady', function(newValue, oldValue){
      console.log(newValue);
    });
  },
}

  • 命令式好处是,可以得到一个取消监听的函数,在需要时取消监听,比如你想要只监听一次,可以像下面使用:
  • 这里只能打印 5 false(第一次改变值)
export default {
  data: {
    isReady: false
  },
  mounted() {
      const unwatch = this.$watch('isReady', function(newValue, oldValue){
        console.log(newValue);
        unwatch()
      });
   },
   created() {
      setTimeout(() =>  {
        this.isReady = 5
      }, 2000)
      setTimeout(() =>  {
        this.isReady = 7
      }, 5000)
   }
}

深度监听(监听对象)deep: true & 立即执行 Immediate : true

-  handler 固定写法
const vm = new Vue({
    el: '#root',
    data() {
      return {
        numbers: {
          a: 1,
          b: 1
        }
      }
    }
watch: {
  'numbers.a': {
    handler(newValue, oldValue) {
      console.log(newValue, oldValue)
      console.log('numbers正在被侦听')
    },
    deep: true,  // 是否深度监听
    immediate: true  // 页面加载立即执行
  }
-------------------------------另一种写法-----------------------------
   'dict.a'(newValue, oldValue){
        console.log(newValue, oldValue)
        console.log('numbers正在被侦听')
   },
}
  • 监听整个 numbers 中 每个属性的变化
 const vm = new Vue({
    el: '#root',
    data() {
      return {
        numbers: {
          a: 1,
          b: 1
        }
      }
    },
   watch: {
      numbers: {
        handler(newValue, oldValue) {
          console.log(newValue, oldValue)
          console.log('numbers正在被侦听')
        },
        deep: true
        immediate: true
      },
    }
    created() {
        setTimeout(() =>  {
          this.numbers.a = 5
          this.numbers.b = 50
        }, 2000)
      }
  })
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Vue Vue是一个前端js框架,由尤雨溪开发,是个人项目 Vue近几年来特别的受关注,三年前的时候angular...
    hcySam阅读 2,187评论 0 0
  • 初识Vue2.0 想让Vue工作,就必须创建一个Vue实例,且要传入一个配置对象 vue容器里的代码依然符合htm...
    Zindex阅读 3,414评论 0 0
  • #vue通信传值 1.props&$emit 1.1 父传子props 现在我们要从Index页面给A页面传递一个...
    太白A阅读 3,038评论 0 0
  • (一) 基本模块 01基础模板语法 1.1插值语法 -- 解析标签体里的内容 data -> {{}} 里可以写j...
    SteinsGate_5e01阅读 9,151评论 0 31
  • 一、相对于其他框架相比 1、相对于Angular 1.1、相对于angular的api,vue的api更简单,...
    我寄你的信总要送往邮局阅读 4,446评论 0 4