亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

解析vue中的$mount

2019-11-19 14:40:26
字體:
來源:轉載
供稿:網友

本文主要是帶領大家分析$mount。

$mount所做的工作從大體來講主要分為3步:

1.如果你的option里面沒有 render 函數,那么,通過 compileToFunctions 將HTML模板編譯成可以生成VNode的Render函數。

2.new 一個 Watcher 實例,觸發 updateComponent 方法。

3.生成vnode,經過patch,把vnode更新到dom上。 由于篇幅有限,這里先說前兩步,第三步下篇說。 好,下面具體的說。首先,我們來到 $mount 函數,如下圖:

 

我們呢可以看到,代碼首先判斷option里面有沒有render函數,沒有的話,進一步判斷有沒有template,沒有的話就用dom元素的outerHTML。得到template以后干什么了呢?如下圖。

  

我們可以看到,調用了 compileToFunctions 將template轉成render函數。這里面有兩個過程:

  • 將template解析成ast語法樹。
  • 通過ast語法樹生成render函數。

具體的將template解析成ast語法樹在本文就不說了,有時間單獨開一個章節分析。好,這下我們拿到render函數了,那么接下來一步干什么了呢?沒錯,就開始 mountComponent 了。如下圖:

  

可以從上圖看到,程序聲明了一個 updateComponent 方法,這個是將要被 Watcher 實例調用的更新組件的方法,過一會分析到 Watcher 的時候將會看到。至于為什么會有個判斷語句來根據條件聲明 updateComponent 方法,其實從 performance 可以看出,其中一個方法是用來測試 render 和 update 性能的。好我們終于該到 Watcher 了,先看這句代碼:

// we set this to vm._watcher inside the watcher's constructor// since the watcher's initial patch may call $forceUpdate (e.g. inside child// component's mounted hook), which relies on vm._watcher being already definednew Watcher(vm, updateComponent, noop, null, true /* isRenderWatcher */);

我們先來分析一下注釋里所說的 _watcher 是啥玩意呢?其實看看 forceupdate 的代碼就知道了:

Vue.prototype.$forceUpdate = function () { var vm = this; if (vm._watcher) {  vm._watcher.update(); } };

就是調用這個vm的 _watcher 的 update 方法。用來強制更新。為什么叫強制更新呢?vue里面有判斷,如果新值 == 舊值, 那么就不觸發watcher更新視圖了~ 所以,如果非要更新就要調用 forceupdate 來強制更新了。好,讓我們來看一看傳進去的參數吧:

  • vm:當前的vm實例
  • updateComponent 這個非常重要,用來在后面將vnode更新到dom上的。
  • noop 無意義的函數
  • null option選項,沒有則為null
  • true 主要是用來判斷是哪個watcher的。因為computed計算屬性和如果你要在options里面配置watch了同樣也是使用了 new Watcher ,加上這個用以區別這三者。好,我們來看看 new Watcher 都做了什么事,如下圖。

 

首先,我們看到代碼有個這個判斷

if (isRenderWatcher) { vm._watcher = this;}

可以看到,如果聲明這個watcher的上下文是用來渲染視圖的,也就是說是在 mountComponent 這里調用的 new Watcher 的時候,才會把this賦值給_watcher。然后把 watcher push到 _watchers 里面,目的是等到組件銷毀時順便把watcher也銷毀掉。然后就是初始化watcher的成員,代碼如下:

this.deep = this.user = this.lazy = this.sync = false;<br />

接下來,就是賦值給 getter , this.getter = expOrFn 。還記得剛才傳過來的 updateComponent 函數么,沒錯,就是這個賦值給我 getter 。然后我們就到了:

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

進入到 get 方法里面,我們看看到底做了什么。get代碼如下圖:

 

我們可以看到,首先它執行的是 pushTarget(this) , pushTarget(this) 代碼如下:

function pushTarget (_target) { if (Dep.target) { targetStack.push(Dep.target); } Dep.target = _target;}

也就是說如果當前有 Dep.target 的話,就把target放到 targetStack 里面,如果沒有的話,就設為當前的target,也就是這個watcher。 接著,就是執行了它的 getter 屬性,也就是剛剛傳入 updateComponent 函數。而 updateComponent 就是我們開篇提到第三步了。

總結

以上所述是小編給大家介紹的vue中的$mount,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美肥老妇视频| 在线观看不卡av| 91在线观看免费| 中文在线资源观看视频网站免费不卡| 亚洲国产小视频在线观看| 久久视频在线视频| 精品国产乱码久久久久酒店| 久久久久久成人精品| 精品成人在线视频| 日韩在线播放视频| 国产精品久久久久9999| 欧美激情视频三区| 欧美亚洲日本黄色| 久久91精品国产91久久久| 亚洲影院色在线观看免费| 人妖精品videosex性欧美| 美女啪啪无遮挡免费久久网站| 欧美成人在线影院| 久久久噜噜噜久久久| 久久综合伊人77777尤物| 91在线观看免费高清完整版在线观看| 国产精品一区二区久久国产| 亚洲国产精品高清久久久| 国产精品99久久久久久久久久久久| 欧美三级免费观看| 自拍亚洲一区欧美另类| 亚洲激情中文字幕| 55夜色66夜色国产精品视频| 国产精品美乳一区二区免费| 国产精品欧美日韩久久| 精品国产成人在线| 国产精品福利片| 欧美性xxxxhd| 中文字幕亚洲欧美日韩在线不卡| 亚洲精品黄网在线观看| 国产亚洲成av人片在线观看桃| 国产999精品久久久影片官网| 欧美精品免费播放| 欧美小视频在线观看| 欧美另类老肥妇| 国产69精品久久久久9| 自拍偷拍免费精品| 日韩av在线网页| 欧美又大粗又爽又黄大片视频| 国产日韩欧美在线观看| 欧美高清视频在线播放| 国产成人精品日本亚洲| 亚洲第一福利视频| 一区二区欧美亚洲| 中文字幕无线精品亚洲乱码一区| 亚洲毛片在线观看.| 欧美精品在线观看91| 午夜精品一区二区三区av| 国产999精品久久久| 亚洲午夜国产成人av电影男同| 亚洲a成v人在线观看| 亚洲免费视频网站| 国产成人久久精品| 日韩欧美中文字幕在线播放| 久久99国产综合精品女同| 国产精品成人免费电影| 久久亚洲综合国产精品99麻豆精品福利| 欧美黑人性生活视频| 九九久久综合网站| 最新国产精品亚洲| 中文字幕精品一区久久久久| 亚洲 日韩 国产第一| 久久天天躁狠狠躁夜夜躁| 日韩国产精品一区| 久久久久久久久久久亚洲| 国产专区欧美专区| 国产精国产精品| 久久久久久久久久久av| 日本一区二区不卡| 欧美性视频精品| 久久久噜噜噜久久久| 第一福利永久视频精品| 欧美亚洲第一页| 51久久精品夜色国产麻豆| 欧美一区二区三区四区在线| 91精品免费久久久久久久久| 久久亚洲精品网站| 日韩欧美国产黄色| 精品视频—区二区三区免费| 久久亚洲欧美日韩精品专区| 色先锋资源久久综合5566| 中文在线资源观看视频网站免费不卡| 欧美黑人巨大精品一区二区| 成人av.网址在线网站| 国产成+人+综合+亚洲欧美丁香花| 中日韩美女免费视频网站在线观看| 538国产精品一区二区在线| 亚洲a中文字幕| 亚洲第一精品自拍| 91精品在线一区| 在线观看日韩专区| 亚洲国内高清视频| 国产精品午夜国产小视频| 色多多国产成人永久免费网站| 第一福利永久视频精品| 国产日本欧美一区二区三区在线| 国产日韩欧美电影在线观看| 亚洲**2019国产| 久久久久久久色| 精品国产91久久久久久老师| 欧美日韩精品在线播放| 日本欧美在线视频| 亚洲国产精品专区久久| 久久精品视频在线| 国内偷自视频区视频综合| 欧美日韩亚洲天堂| 日韩一区在线视频| 日韩电影中文字幕在线观看| 欧美最猛性xxxxx免费| 亚洲最大福利视频| 亚洲性夜色噜噜噜7777| 亚洲欧美在线一区二区| 国产一区二区黄| 国产69精品久久久久99| 久久久久日韩精品久久久男男| 国产精品∨欧美精品v日韩精品| 亚洲欧美成人一区二区在线电影| 精品久久中文字幕久久av| 欧美精品一区在线播放| 国产一区欧美二区三区| 在线观看不卡av| 日韩最新中文字幕电影免费看| 国产剧情久久久久久| 中文字幕亚洲一区二区三区五十路| 青青久久av北条麻妃黑人| 亚洲男人av在线| 夜夜狂射影院欧美极品| 国内外成人免费激情在线视频| 92福利视频午夜1000合集在线观看| 国产精品爽黄69天堂a| 日韩不卡中文字幕| 26uuu国产精品视频| 国产欧美日韩亚洲精品| 国产精品高精视频免费| 国产精品高清网站| 欧美日韩精品在线| 日韩免费在线电影| 久久精品亚洲国产| 国产日韩换脸av一区在线观看| 精品网站999www| 亚洲男人天堂网| 国产一区二区激情| 国模精品视频一区二区三区| 91视频国产一区| 国产精品日本精品| 欧美黄色片在线观看| 亚洲成人a级网| 亚洲日韩中文字幕| 日韩av在线网站| 欧美大尺度激情区在线播放| 日韩中文字幕在线播放| 久久久精品2019中文字幕神马| 日韩av中文字幕在线免费观看| 欧美国产高跟鞋裸体秀xxxhd| 精品亚洲永久免费精品| 日韩乱码在线视频| 奇米成人av国产一区二区三区| 久久视频国产精品免费视频在线| 国产精品18久久久久久首页狼|