详解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 相关文章推荐
javascript实现的使用方向键控制光标在table单元格中切换
Nov 17 Javascript
IE与FF下javascript获取网页及窗口大小的区别详解
Jan 14 Javascript
javascript制作的cookie封装及使用指南
Jan 02 Javascript
JSON相关知识汇总
Jul 03 Javascript
基于JavaScript定位当前的地理位置
Apr 11 Javascript
vue-router实现组件间的跳转(参数传递)
Nov 07 Javascript
vue双向绑定及观察者模式详解
Mar 19 Javascript
微信小程序云开发如何使用npm安装依赖
May 18 Javascript
vue2 拖动排序 vuedraggable组件的实现
Aug 08 Javascript
JavaScript如何把两个数组对象合并过程解析
Oct 10 Javascript
Node如何后台数据库使用增删改查功能
Nov 21 Javascript
如何在vue中使用video.js播放m3u8格式的视频
Feb 01 Vue.js
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
php+ajax注册实时验证功能
2016/07/20 PHP
php封装json通信接口详解及实例
2017/03/07 PHP
javascript 原型模式实现OOP的再研究
2009/04/09 Javascript
原生Js与jquery的多组处理, 仅展开一个区块的折叠效果
2011/01/09 Javascript
Javascript类定义语法,私有成员、受保护成员、静态成员等介绍
2011/12/08 Javascript
浅谈JavaScript 的执行顺序
2015/08/07 Javascript
基于JavaScript实现弹出框效果
2016/02/19 Javascript
Node.js设置CORS跨域请求中多域名白名单的方法
2017/03/28 Javascript
layui分页效果实现代码
2017/05/19 Javascript
详解Vue2.x-directive的学习笔记
2017/07/17 Javascript
ES6新特性:使用export和import实现模块化详解
2017/07/31 Javascript
JS动态添加元素及绑定事件造成程序重复执行解决
2017/12/07 Javascript
详解使用jQuery.i18n.properties实现js国际化
2018/05/04 jQuery
JQuery模拟实现网页中自定义鼠标右键菜单功能
2018/11/14 jQuery
Vue的生命周期操作示例
2019/09/17 Javascript
VUE 直接通过JS 修改html对象的值导致没有更新到数据中解决方法分析
2019/12/02 Javascript
vue vant中picker组件的使用
2020/11/03 Javascript
王纯业的Python学习笔记 下载
2007/02/10 Python
python遍历目录的方法小结
2016/04/28 Python
Python pyinotify日志监控系统处理日志的方法
2018/03/08 Python
Python3利用Dlib19.7实现摄像头人脸识别的方法
2018/05/11 Python
利用python修改json文件的value方法
2018/12/31 Python
python3正则提取字符串里的中文实例
2019/01/31 Python
python文字转语音实现过程解析
2019/11/12 Python
python3爬取torrent种子链接实例
2020/01/16 Python
python_array[0][0]与array[0,0]的区别详解
2020/02/18 Python
Python Numpy,mask图像的生成详解
2020/02/19 Python
详解Python 最短匹配模式
2020/07/29 Python
马来西亚时装购物网站:ZALORA马来西亚
2017/03/14 全球购物
本科生的职业生涯规划范文
2014/01/09 职场文书
教师师德考核自我评价
2014/09/13 职场文书
财务科长个人对照检查材料
2014/09/18 职场文书
计算机教师工作总结
2015/08/13 职场文书
关于运动会的广播稿
2015/08/19 职场文书
2019入党申请书格式和范文
2019/06/25 职场文书
C#连接ORACLE出现乱码问题的解决方法
2021/10/05 Oracle