问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

浅析Vue中的$watch方法原理

发布网友 发布时间:2024-09-26 17:52

我来回答

1个回答

热心网友 时间:2024-11-17 04:19

$watche方法的两个参数:

第一个参数两种可能:

传入被观察对象表达式(字符串),比如'a,b,c','$route'

如果表达式无法表示需要观察的内容,可以通过函数返回,比如:()=>this.a+this.b

第一个参数干什么用的?通过vue源码可得,newWatcher的流程:第一步:拿到第一个参数,如果是函数,直接拿到函数,如果不是函数,转换为函数(parsePath),这个作为getter,先不调用,只备用

//parseexpressionforgetterif(typeofexpOrFn==='function'){this.getter=expOrFn}else{this.getter=parsePath(expOrFn)if(!this.getter){this.getter=noop//noop就是空}}

第二步:调用Watcher类里的this.get:

this.value=this.lazy?undefined:this.get()

插入下源代码:

/***Evaluatethegetter,andre-collectdependencies.*/get(){pushTarget(this)letvalueconstvm=this.vmtry{value=this.getter.call(vm,vm)}catch(e){if(this.user){handleError(e,vm,`getterforwatcher"${this.expression}"`)}else{throwe}}finally{//"touch"everypropertysotheyarealltrackedas//dependenciesfordeepwatchingif(this.deep){traverse(value)}popTarget()this.cleanupDeps()}returnvalue}

第三步:上面的源码就是this.get方法,看看里面有什么,这里第一句就是把当前watcher实例设置成Dep.target(姑且理解为全局变量),:

pushTarget(this)

关于Dep.target:回忆一下,在defineProperty的get里,是不是也用到了这Dep.target,对了!defineProperty里就是取这个Dep.target值,watcher只有一处取值,一处赋值,那么这个值在哪里赋上去的呢?对了!就是在这个pushTarget里

第四步:Dep.target已经有值了,调用一下之前备用的getter(上面第一步),这样就能触发defineProperty的get了,触发以后,就把这个watcher添加到get对应数据的deps依赖数组里了

value=this.getter.call(vm,vm)

这样,再修改这个设置了defineProperty的响应式数据,就能触发这个数据绑定的所有watcher依赖了。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
手机导航地图语音怎么下载 如何分别真金和仿金首饰 怎样区分真金和仿金首饰呢 小学生新年晚会主持人的串词!!(不要太多)急 大大后天就需要了!!!_百度... 周年晚会策划公司 奥格瑞玛传送门大厅在哪 奥格瑞玛传送门大厅怎么走 锻炼颈椎的几个动作 水多久能结冰 冰能在多长时间内形成 请问水低于0度会结冰吗? 如何防止脱发严重 致命关系电视剧-致命关系 弟弟的花样睡型作文 家居风水:室内千万别养这9种花,不但有毒还招来霉运! iphone6s已与物主锁定了能刷掉吗 ...的尤勇演个警察好像叫申男。 谁知道这个到底叫什么名 谁有在线... 有一个电视剧是侦破悬疑的尤勇演个警察 谁知道这个到底叫什么名 谁有... 作文小弟弟睡觉时的样子 请问哪里有《杨光的快乐生活》下载地址,不是用bt下载,用迅雷可以下载的... 杨光的快乐生活那个土老板砸宝马车是第三部的哪一集? 苹果手机6s安全锁定后怎么解锁 iphone6s屏幕锁忘了怎么解锁? 谁能给我一个杨光的快乐生活3的下载地址啊? 求《杨光的快乐生活第三部》最后一集的下载地址 脸过敏发红痒应该怎么办 使用护肤品脸部皮肤过敏怎么办? 美的落地电风扇一开电机就咬死,一关转子就用手转动,是机坏了吗? 今天新买的ipadmini3.买回来一直没充电, 用到自动关机的时候充电,冲... 糯米3mini手机电越充越少怎么办 宝宝拉屎?一岁两个月宝宝最近几天老是半夜拉屎怎么办而且拉出来的屎正常... 宝宝几天拉一次大便正常 手写Vue源码(七) - 实现Watch属性 Vue源码解析:详解数据初始化过程及computed实现原理 Vue 超清晰思维导图(7张),详细知识点梳理! Vue2 源码解析 感觉热但是不发烧是什么情况 格力u雅系列1.5匹空调冬季使用制热室内面积十九平米室温能达多少 男人身上发热但不发烧怎么回事 浑身感觉热但是不发烧怎么回事 ...大概宽有3.5米,高4米多 不知道该弄什么。背景是淡蓝色,用无框... 急求电视背景墙立面图 高2.6米,宽3.5米,客厅和餐厅轻质隔断2.8米*... 宽3.5长5米的客厅如何简装好看? 请问一下这空调究竟多少度啊? 不发烧但是感觉身体发热是怎么回事 七招遏制糖尿病:糖尿病的根源与应对策略目录 女性浑身发热但是不发烧是怎么回事 高血压治疗的10大误区 女性春季少坐多动预防 *** 发「霉」 精神分裂症的九大的认识误区 天然气初装费还要交吗 肺结节病 甲状腺多发结节 甲状腺多发结节病怎样治疗拜托各位了 3Q