详解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 相关文章推荐
prototype 1.5相关知识及他人笔记
Dec 16 Javascript
新手常遇到的一些jquery问题整理
Aug 16 Javascript
Chrome Form多次提交表单问题的解决方法
May 09 Javascript
JavaScript实现页面5秒后自动跳转的方法
Apr 16 Javascript
js实现YouKu的漂亮搜索框效果
Aug 19 Javascript
如何判断Javascript对象是否存在的简单实例
May 18 Javascript
node.js版本管理工具n无效的原理和解决方法
Nov 24 Javascript
用jQuery实现可输入多选下拉组合框实例代码
Jan 18 Javascript
js编写选项卡效果
May 23 Javascript
AngularJS实现的base64编码与解码功能示例
May 17 Javascript
如何用webpack4带你实现一个vue的打包的项目
Jun 20 Javascript
jQuery实现可编辑的表格
Dec 11 jQuery
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.ini中文版
2006/10/09 PHP
php启用sphinx全文搜索的实现方法
2014/12/24 PHP
Apache连接PHP后无法启动问题解决思路
2015/06/18 PHP
浅析PHP7新功能及语法变化总结
2016/06/17 PHP
PHP观察者模式示例【Laravel框架中有用到】
2018/06/15 PHP
javascript引用对象的方法代码
2007/08/13 Javascript
再谈javascript面向对象编程
2012/03/18 Javascript
js获取通过ajax返回的map型的JSONArray的方法
2014/01/09 Javascript
Extjs Label的 fieldLabel和html属性值对齐的方法
2014/06/15 Javascript
jquery调取json数据实现省市级联的方法
2015/01/29 Javascript
JavaScript中split与join函数的进阶使用技巧
2016/05/03 Javascript
vue实现app页面切换动画效果实例
2017/05/23 Javascript
关于使用js算总价的问题
2017/06/23 Javascript
js自定义弹框插件的封装
2020/08/24 Javascript
vue与vue-i18n结合实现后台数据的多语言切换方法
2018/03/08 Javascript
layui 给数据表格加序号的方法
2018/08/20 Javascript
JS实现的小火箭发射动画效果示例
2018/12/08 Javascript
JS实现简易计算器
2020/02/14 Javascript
《javascript设计模式》学习笔记三:Javascript面向对象程序设计单例模式原理与实现方法分析
2020/04/07 Javascript
Electron+vue从零开始打造一个本地播放器的方法示例
2020/10/27 Javascript
nuxt 自定义 auth 中间件实现令牌的持久化操作
2020/11/05 Javascript
利用Python读取文件的四种不同方法比对
2017/05/18 Python
详解python中executemany和序列的使用方法
2017/08/12 Python
Windows下安装Django框架的方法简明教程
2018/03/28 Python
用python处理图片实现图像中的像素访问
2018/05/04 Python
python 解决print数组/矩阵无法完整输出的问题
2020/02/19 Python
html5 application cache遇到的严重问题
2012/12/26 HTML / CSS
h5使用canvas画布实现手势解锁
2019/01/04 HTML / CSS
法学研究生自我鉴定范文
2013/12/04 职场文书
社区工作者演讲稿
2014/05/23 职场文书
标准毕业生自荐信
2014/06/24 职场文书
公司市场专员岗位职责
2014/06/29 职场文书
家庭困难证明
2014/10/12 职场文书
小学优秀教师事迹材料
2014/12/16 职场文书
党员干部学法用法心得体会
2016/01/21 职场文书
Win10此设备不支持接收Miracast无法投影的解决方法
2022/07/07 数码科技