详解vue2 $watch要注意的问题


Posted in Javascript onSeptember 08, 2017

使用$watch监听的时候,监听的数据是一个对象的时候,要注意几点:

监听组件内某个对象里面的某项属性时,不要监听对象,直接监听对象里面的属性(深度监听),只有直接监听这个对象里面的属性,只更新对象里面的属性时也能直接监听到此数组的变化。

data(){
return {
msgs : {
list:[1,2,3]
}
}
},
watch:{
msg(newVal,oldVal){
console.log(newVal);//(1)
},
"msg.list":function(newVal,oldVal){
console.log(newVal)//(2)
}
},
mounted(){
this.$set(this.msg,"list",[1,2,3,4]);//(1)不会打印,(2)会打印
this.$set(this,"msg",{list:[1,2,3,4]}//(1)会打印,(2)会打印
}

数据驱动基于Object.defineProperty()这个功能进行实现,在vue中的数据对象就用树来表示,树的每一个叶子节点都会用Object.defineProperty()来定义get/set方法,而在set方法执行的时候会执行watch方法,实现数据的监听。

我们可以监听树的任一叶子节点,当叶子节点数据发生变化的时候,会执行此叶子节点中监听的方法,同时下级以及下下级甚至更下级的叶子节点的监听方法也会执行(前提是对应的叶子节点数据也有改变).

如下

data(){
 return {
msgs:{
list:[1,2,3],
msg:'1'
}
 }
},
watch:{
msgs(newVal,oldVal){
console.log(newVal);//(1)
},
"msgs.list":function(newVal,oldVal){
console.log(newVal)//(2)
}
"msgs.msg":function(newVal,oldVal){
console.log(newVal)//(3)
}
},
mounted(){
//下面的例子一个一个实验,不要放在一起运行,会造成结果错误。当然也可以自己验证如何放在一起也能验证下面的结果是正确的。

this.$set(this.msgs,"list",[1,2,3,4]);//(1)(3)不会打印,(2)会打印
//分析:这个是更新msgs树中list叶子节点的数据,会触发到 “msgs.list”的监听方法,从而(2)被打印
this.$set(this,"msgs",{list:[1,2,3,5]});//(1)(2)(3)都会打印
//分析:这个是更新msgs中的根节点的数据,会触发“msgs”的监听方法,因根节点下面还有子节点,会继续往下遍历,发现list节点的数据也随之改变,由[1,2,3]=>[1,2,3,4],触发了“msgs.list”的监听方法,同理msg节点的数据从 "1"=>"undefined",也会触发“msgs.msg”的监听方法,所以(1)(2)(3)都会打印。
this.$set(this,"msgs",{list:[1,2,3,4],msg:"1"});//(1)(2)会打印,(3)不会打印
//分析:这个与上面不同的是msg节点的内容并没有改变,一直都是“1”,所以不会触发“msgs.msg”的监听方法,所以(3)没有打印,(1)(2)都会打印
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS BASE64编码 window.atob(), window.btoa()
Mar 09 Javascript
超级强大的表单验证
Jun 26 Javascript
javascript中巧用“闭包”实现程序的暂停执行功能
Apr 04 Javascript
基于Jquery的文字自动截取(提供源代码)
Aug 09 Javascript
JS连接SQL数据库与ACCESS数据库的方法实例
Nov 21 Javascript
详解Javascript动态操作CSS
Dec 08 Javascript
详解jQuery事件
Jan 13 Javascript
vue select二级联动第二级默认选中第一个option值的实例
Jan 10 Javascript
基于Vue的ajax公共方法(详解)
Jan 20 Javascript
简单了解JavaScript sort方法
Nov 25 Javascript
js实现验证码功能
Jul 24 Javascript
vue select 获取value和lable操作
Aug 28 Javascript
Express + Session 实现登录验证功能
Sep 08 #Javascript
Vue中组件之间数据的传递的示例代码
Sep 08 #Javascript
详解jquery插件jquery.viewport.js学习使用方法
Sep 08 #jQuery
JavaScript实现开关等效果
Sep 08 #Javascript
浅谈React Native 中组件的生命周期
Sep 08 #Javascript
Vue仿手机qq的实例代码(demo)
Sep 08 #Javascript
关于Ajax的原理以及代码封装详解
Sep 08 #Javascript
You might like
yii2高级应用之自定义组件实现全局使用图片上传功能的方法
2016/10/08 PHP
js操作textarea方法集合封装(兼容IE,firefox)
2011/02/22 Javascript
JavaScript模块随意拖动示例代码
2014/05/27 Javascript
jQuery中triggerHandler()方法用法实例
2015/01/19 Javascript
JavaScript中的方法重载实例
2015/03/16 Javascript
JS数字抽奖游戏实现方法
2015/05/04 Javascript
js实现简单折叠、展开菜单的方法
2015/08/28 Javascript
基于jQuery实现的扇形定时器附源码下载
2015/10/20 Javascript
JavaScript中的return语句简单介绍
2015/12/07 Javascript
原生JS版和jquery版实现checkbox的全选/全不选/点选/行内点选(Mr.Think)
2016/10/29 Javascript
node.js与C语言 实现遍历文件夹下最大的文件,并输出路径,大小
2017/01/20 Javascript
基于Vue渲染与插件的加载顺序的问题详解
2018/03/05 Javascript
vue实现动态显示与隐藏底部导航的方法分析
2019/02/11 Javascript
在VUE中使用lodash的debounce和throttle操作
2020/11/09 Javascript
在Python中使用判断语句和循环的教程
2015/04/25 Python
Python numpy 提取矩阵的某一行或某一列的实例
2018/04/03 Python
pandas数值计算与排序方法
2018/04/12 Python
在pycharm 中添加运行参数的操作方法
2019/01/19 Python
Django 大文件下载实现过程解析
2019/08/01 Python
Pytorch基本变量类型FloatTensor与Variable用法
2020/01/08 Python
python扫描线填充算法详解
2020/02/19 Python
Python实现GIF图倒放
2020/07/16 Python
Python+OpenCV检测灯光亮点的实现方法
2020/11/02 Python
CSS3制作轮播图的一种方法
2019/11/11 HTML / CSS
加拿大健康、婴儿和美容产品在线购物:Well.ca
2016/11/30 全球购物
Clarins娇韵诗英国官网:来自法国的天然护肤品牌
2017/04/18 全球购物
家乐福台湾线上购物网:Carrefour台湾
2020/09/15 全球购物
学校大课间活动方案
2014/01/30 职场文书
有关爱国演讲稿
2014/05/07 职场文书
实习生工作证明范本
2014/09/14 职场文书
离婚协议书范本(通用篇)
2014/11/30 职场文书
医院办公室主任岗位职责
2015/04/01 职场文书
行为规范主题班会
2015/08/13 职场文书
css 中多种边框的实现小窍门
2021/04/07 HTML / CSS
Python中json.load()和json.loads()有哪些区别
2021/06/07 Python
GO语言字符串处理函数之处理Strings包
2022/04/14 Golang