当前位置:首页 > 日记 > 正文

详解vue2 $watch要注意的问题

详解vue2 $watch要注意的问题

使用$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)都会打印}

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

相关文章

Photoshop 绘制蓝色水晶网页按钮

Photoshop 绘制蓝色水晶网页按钮

绘制,网页,按钮,水晶,蓝色,1.创建背景 首先,我们必须新建ps文档.大小为200*200像素. 使用圆角矩形工具创建类似形状: 在新图层上更改样式如下: 使用椭圆选框工具选出如下形状: 现在选择你的第一个图层,运行 选择>载入选区,按确定键.然…

php7安装mongoDB扩展的方法分析

php7安装mongoDB扩展的方法分析

扩展,方法,安装,电脑软件,mongoDB,本文讲述了php7安装monDB扩展的方法。分享给大家供大家参考,具体如下:这里我们使用pecl命令来安装首先来到php7的安装目录$ /usr/local/php7/bin/pecl install mondb回车,执行成功后,会输出以下结果:……Build …

jQuery实现表格奇偶行显示不同背景

jQuery实现表格奇偶行显示不同背景

奇偶,背景色,显示,表格,简单,做表格的时候,经常要让奇偶行显示不同背景色,一来使表格显得更美观,二来使同行数据查找更快捷方便。通常我们是怎么实现的呢?就是在每个tr标签上加css样式。代码如下所示:<html><style type="text/css">.odd { bac…

PS怎么制作一个晚安表情包?

PS怎么制作一个晚安表情包?

表情,电脑软件,PS,晚安表情包适合在晚上使用,这样的一个表情包能够很好的传递人与人之间的这种亲切性。要制作这样的一个表情包并不难,睡觉表情与月亮元素是非常动感的。软件名称:Adobe Photoshop 8.0 中文完整绿色破解版软件大小:150.1MB更新…

PPT如何设置缩放比例图文教程

PPT如何设置缩放比例图文教程

缩放比例,图文教程,设置,方法,如何设置,  PPT中插入了图片,在播放时候,怎样才能引起观众的注意呢?方法很多,我们今天就介绍一种,通过放大和缩小照片,吸引观众的目光!下面小编马上就告诉大家PPT设置图片缩放比例的方法。在PPT设置图片缩放比例…

JavaScript实现网页头部进度条刷新

JavaScript实现网页头部进度条刷新

网页,刷新,进度条,电脑软件,JavaScript,本文刷新会头部会出现,因为并没有真正的参与到浏览器加载是否完整这个渲染过程中来,所以只是一个表象,并不是说这个显示完了就浏览器也加载完了所以资源。效果图:先看下html:就两个标签<div id="barbg"…

微信小程序 页面跳转传值实现代码

微信小程序 页面跳转传值实现代码

传值,页面跳转,代码,程序,电脑软件,微信小程序 页面跳转传值实现代码微信小程序的页面路径只能是五层;现在场景如下:index(首页)打开新页面 list(列表)打开新页面search(条件查询)确定条件返回 list(列表);这里有个限制,微信只能打开五层网页,意味着:在se…

PS怎么使用计数工具? PS计数工具计

PS怎么使用计数工具? PS计数工具计

工具,方法,电脑软件,PS,ps中的工具很多,今天我们就来看看计数工具的使用方法,很简单,详细如下文所示。软件名称:Adobe Photoshop 8.0 中文完整绿色破解版软件大小:150.1MB更新时间:2015-11-041、举个简单的例子演示下操作方法,现在,要统计下图中的…

JavaScript中数组Array方法详解

JavaScript中数组Array方法详解

方法,数组,详解,电脑软件,JavaScript,ECMAScript 3在Array.prototype中定义了一些很有用的操作数组的函数,这意味着这些函数作为任何数组的方法都是可用的。1、Array.join()方法Array.join()方法将数组中所有元素都转化为字符串并连接在一起…

vue轮播图插件vue-awesome-swiper

vue轮播图插件vue-awesome-swiper

轮播图,代码实例,插件,电脑软件,vue,最近写vue2.0项目中用到了轮播图的一个插件,也就是vue-awesome-swiper,个人感觉还是比较强大的,swiper官网中的API及配置均可使用(支持3.0),以下说下使用该插件的一些步骤:第一步安装npm install vue-awesome…

AI混合工具制作低多边形风格几何lo

AI混合工具制作低多边形风格几何lo

混合,教程,工具,多边形,几何,版权申明:本文原创作者&ldquo;如如酱w &rdquo;,感谢&ldquo;如如酱w &rdquo;的原创经验分享!低多边形的正式名称叫做 Low Poly 3D,翻译过来叫做低面设计或低多边形设计。 低多边形风格正火,接下来小编就给大家分析分…

excel2007停止工作的解决方法excel

excel2007停止工作的解决方法excel

解决方法,工作,电脑软件,strong,  停止工作解决方法在Excel中是比较常用的功能之一,如果有不懂的朋友却需要用到这个功能的朋友不妨学习一番吧!接下来是小编为大家带来的excel2007停止工作的解决方法,供大家参考。excel2007停止工作的解决…