vue中的watch监听数据变化及watch中各属性的详解


Posted in Javascript onSeptember 11, 2018

首先确认 watch是一个对象,一定要当成对象来用。 

对象就有键,有值。

键:就是你要监控的那个家伙,比如说$route,这个就是要监控路由的变化。或者是data中的某个变量。
值可以是函数:就是当你监控的家伙变化时,需要执行的函数,这个函数有两个形参,第一个是当前值,第二个是变化后的值。

值也可以是函数名:不过这个函数名要用单引号来包裹。 

 第三种情况厉害了。

值是包括选项的对象:选项包括有三个。

1.第一个handler:其值是一个回调函数。即监听到变化时应该执行的函数。
2.第二个是deep:其值是true或false;确认是否深入监听。(一般监听时是不能监听到对象属性值的变化的,数组的值变化可以听到。)
3.第三个是immediate:其值是true或false;确认是否以当前的初始值执行handler的函数。

1、watch使用的几种方法

(1)通过watch监听data数据的变化,数据发生变化时,就会打印当前的值

watch: {
  data(val, newval) {
    console.log(val)
    console.log(newval)
  }
 }

(2)通过watch监听docData数据的变化,数据发生变化时,this.change_number++(使用深度监听)

watch: {
  docData: {
   handler(newVal) {
    this.change_number++
   },
   deep: true
  }
}

(3)通过watch监听data数据的变化,数据发生变化时,执行changeData方法

watch: {
  data: 'changeData' // 值可以为methods的方法名
},
methods: {
   changeData(curVal,oldVal){
    conosle.log(curVal,oldVal)

}
}

2、详解watch中的immediate、handler和deep属性

(1)immediate和handler

这样使用watch时有一个特点,就是当值第一次绑定时,不会执行监听函数,只有值发生改变时才会执行。如果我们需要在最初绑定值的时候也执行函数,则就需要用到immediate属性。

eg:

watch: {
   docData: {
    handler(newVal) {
      this.change_number++
    },
    immediate: true
   }
}

(2)deep

当需要监听一个对象的改变时,普通的watch方法无法监听到对象内部属性的改变,此时就需要deep属性对对象进行深度监听。

eg:
data() {
  return {
    docData: {
      'doc_id': 1,
      'tpl_data': 'abc'
    }
  }
},
watch: {
   docData: {
    handler(newVal) {
      this.change_number++
    },
    deep: true
  }  
}

设置deep:true则可以监听到docData.doc_id的变化,此时会给docData的所有属性都加上这个监听器,当对象属性较多时,每个属性值的变化都会执行handler。如果只需要监听对象中的一个属性值,则可以做以下优化:使用字符串的形式监听对象属性:

eg:
data() {
  return {
    docData: {
      'doc_id': 1,
      'tpl_data': 'abc'
    }
  }
},
watch: {
  'docData.doc_id': {
    handler(newVal, oldVal) {
      ......
    },
    deep: true
  }  
}

这样只会给对象的某个特定的属性加监听器

3、总结

数组(一维、多维)的变化不需要通过深度监听,对象数组中对象的属性变化则需要deep深度监听。

以上所述是小编给大家介绍的vue中的watch监听数据变化及watch中各属性的详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JS的递增/递减运算符和带操作的赋值运算符的等价式
Dec 08 Javascript
jQuery中Dom的基本操作小结
Jan 23 Javascript
js键盘事件的keyCode
Jul 29 Javascript
在Node.js应用中使用Redis的方法简介
Jun 24 Javascript
JS实现仿腾讯微博无刷新删除微博效果代码
Oct 16 Javascript
js实现微信分享代码
Oct 11 Javascript
JQuery EasyUI的使用
Feb 24 Javascript
在iframe中使bootstrap的模态框在父页面弹出问题
Aug 07 Javascript
javascript中的event loop事件循环详解
Dec 14 Javascript
js中null与空字符串""的区别讲解
Jan 17 Javascript
AngularJS实现的自定义过滤器简单示例
Feb 02 Javascript
js防抖函数和节流函数使用场景和实现区别示例分析
Apr 11 Javascript
vue axios数据请求get、post方法及实例详解
Sep 11 #Javascript
js监听html页面的上下滚动事件方法
Sep 11 #Javascript
vue 使用html2canvas将DOM转化为图片的方法
Sep 11 #Javascript
Vue项目数据动态过滤实践及实现思路
Sep 11 #Javascript
使用vue.js在页面内组件监听scroll事件的方法
Sep 11 #Javascript
vue+axios+element ui 实现全局loading加载示例
Sep 11 #Javascript
Webpack之tree-starking 解析
Sep 11 #Javascript
You might like
php file_get_contents函数轻松采集html数据
2010/04/22 PHP
Trying to clone an uncloneable object of class Imagic的解决方法
2012/01/11 PHP
PHP中防止直接访问或查看或下载config.php文件的方法
2012/07/07 PHP
浅谈php+phpStorm+xdebug配置方法
2015/09/17 PHP
Laravel中批量赋值Mass-Assignment的真正含义详解
2017/09/29 PHP
PHP中__set()实例用法和基础讲解
2019/07/23 PHP
如何运行/调试你的PHP代码
2020/10/23 PHP
AngularJS中取消对HTML片段转义的方法例子
2015/01/04 Javascript
浅谈javascript 归并方法
2015/01/21 Javascript
javascript cookie用法基础教程(概念,设置,读取及删除)
2016/09/20 Javascript
浅谈vue中数据双向绑定的实现原理
2017/09/14 Javascript
五步轻松实现JavaScript HTML时钟效果
2020/03/25 Javascript
vue+springboot前后端分离实现单点登录跨域问题解决方法
2018/01/30 Javascript
vue 2.8.2版本配置刚进入时候的默认页面方法
2018/09/21 Javascript
vue通过指令(directives)实现点击空白处收起下拉框
2018/12/06 Javascript
微信端调取相册和摄像头功能,实现图片上传,并上传到服务器
2019/05/16 Javascript
Vue实现手机扫描二维码预览页面效果
2020/05/28 Javascript
Vue列表如何实现滚动到指定位置样式改变效果
2020/05/09 Javascript
Vue2.0 $set()的正确使用详解
2020/07/28 Javascript
[00:32]2018DOTA2亚洲邀请赛EG出场
2018/04/03 DOTA
Python爬虫模拟登录带验证码网站
2016/01/22 Python
详解python开发环境搭建
2016/12/16 Python
关于Python面向对象编程的知识点总结
2017/02/14 Python
Python编程判断一个正整数是否为素数的方法
2017/04/14 Python
在Python程序员面试中被问的最多的10道题
2017/12/05 Python
关于Python字符串显示u...的解决方式
2020/03/06 Python
生产车间实习自我鉴定
2013/09/23 职场文书
我的五年职业生涯规划
2014/01/23 职场文书
学生自我评语大全
2014/04/18 职场文书
推普周活动总结
2014/08/28 职场文书
放假通知怎么写
2015/08/18 职场文书
新娘婚礼答谢词
2015/09/29 职场文书
tensorboard 可视化之localhost:6006不显示的解决方案
2021/05/22 Python
React配置子路由的实现
2021/06/03 Javascript
《异世界四重奏》剧场版6月10日上映 PV视觉图原创角色发表
2022/03/20 日漫
讨论nginx location 顺序问题
2022/05/30 Servers