vue面試之new Vue的時(shí)候到底做了什么
Vue加載流程
1.初始化的第一階段是Vue實(shí)例也就是vm對(duì)象創(chuàng)建前后:首先Vue進(jìn)行生命周期,事件初始化發(fā)生在beforeCreate生命周期函數(shù)前,然后進(jìn)行數(shù)據(jù)監(jiān)測(cè)和數(shù)據(jù)代理的初始化,也就是創(chuàng)建vm對(duì)象的過(guò)程,當(dāng)vm對(duì)象創(chuàng)建完成就可以通過(guò)vm對(duì)象訪問(wèn)到劫持的數(shù)據(jù),比如data中的數(shù)據(jù),methods中的方法等。然后Vue調(diào)用內(nèi)部的render函數(shù)開始解析模板將其解析為一個(gè)JS對(duì)象也即在內(nèi)存中生成虛擬DOM也就是Vnode對(duì)象。第二階段是vm對(duì)象掛載前后:掛載完成前頁(yè)面呈現(xiàn)的是未經(jīng)過(guò)Vue編譯的DOM結(jié)構(gòu),所有對(duì)DOM的操作最終都不會(huì)生效。掛載前首先將內(nèi)存中的Vnode轉(zhuǎn)換為真實(shí)DOM插入頁(yè)面,此時(shí)完成掛載。頁(yè)面中呈現(xiàn)的就是經(jīng)過(guò)Vue編譯的DOM結(jié)構(gòu),至此初始化過(guò)程結(jié)束。
2.開啟訂閱消息也就是數(shù)據(jù)劫持代理監(jiān)聽,其實(shí)就是寫了一個(gè)watcher函數(shù)去監(jiān)聽數(shù)據(jù)的改變,發(fā)送網(wǎng)絡(luò)請(qǐng)求,綁定自定義事件等初始化操作。當(dāng)數(shù)據(jù)發(fā)生變化以后即狀態(tài)變更的時(shí)候,會(huì)重新構(gòu)造新的Vnode對(duì)象。然后用新的Vnode對(duì)象和舊的Vnode對(duì)象進(jìn)行差異比較也就是DIFF算法,然后把差異應(yīng)用到舊的Vnode對(duì)象所構(gòu)建的真正的DOM樹上這個(gè)過(guò)程就是patch,視圖就更新了
每一個(gè)組件在加載時(shí)都會(huì)調(diào)用Vue內(nèi)部的render函數(shù)把該組件的tamplate選項(xiàng)的模板解析為一個(gè)JS對(duì)象,這個(gè)對(duì)象和DOM節(jié)點(diǎn)對(duì)象結(jié)構(gòu)一樣,然后是數(shù)據(jù)劫持代理監(jiān)聽,當(dāng)數(shù)據(jù)發(fā)生變化以后,將舊Vnode對(duì)象和生成的新Vnode對(duì)象比較差異然后更新DOM
Vnode: { tag:"", id:, name:"Box", $el:真實(shí)頁(yè)面上的DOM的引用, //等等屬性 chiren:[ { tag:"", id:, name:"Box2", $el:真實(shí)頁(yè)面上的DOM的引用, //等等屬性 }, { tag:"", id:, name:"Box3", $el:真實(shí)頁(yè)面上的DOM的引用, //等等屬性 } ] }
什么是DIFF
diff算法是一種對(duì)比算法。對(duì)比兩者是舊虛擬DOM和新虛擬DOM,對(duì)比出是哪個(gè)虛擬節(jié)點(diǎn)更改了,找出這個(gè)虛擬節(jié)點(diǎn),并只更新這個(gè)虛擬節(jié)點(diǎn)所對(duì)應(yīng)的真實(shí)節(jié)點(diǎn),而不用更新其他數(shù)據(jù)沒(méi)發(fā)生改變的節(jié)點(diǎn),實(shí)現(xiàn)精準(zhǔn)地更新真實(shí)DOM,進(jìn)而提高效率
其有兩個(gè)特點(diǎn):
- 比較只會(huì)在同層級(jí)進(jìn)行, 不會(huì)跨層級(jí)比較
- 在diff比較的過(guò)程中,循環(huán)從兩邊向中間比較
DIFF算法的過(guò)程:
- 當(dāng)數(shù)據(jù)發(fā)生改變時(shí),訂閱者
watcher
就會(huì)調(diào)用patch
給真實(shí)的DOM
打補(bǔ)丁 - 通過(guò)
isSameVnode
進(jìn)行判斷,相同則調(diào)用patchVnode
方法 patchVnode
做了以下操作:- 找到對(duì)應(yīng)的真實(shí)
dom
,稱為el
- 如果都有都有文本節(jié)點(diǎn)且不相等,將
el
文本節(jié)點(diǎn)設(shè)置為Vnode
的文本節(jié)點(diǎn) - 如果
oldVnode
有子節(jié)點(diǎn)而VNode
沒(méi)有,則刪除el
子節(jié)點(diǎn) - 如果
oldVnode
沒(méi)有子節(jié)點(diǎn)而VNode
有,則將VNode
的子節(jié)點(diǎn)真實(shí)化后添加到el
- 如果兩者都有子節(jié)點(diǎn),則執(zhí)行
updateChildren
函數(shù)比較子節(jié)點(diǎn)
- 找到對(duì)應(yīng)的真實(shí)
updateChildren
主要做了以下操作:- 設(shè)置新舊
VNode
的頭尾指針 - 新舊頭尾指針進(jìn)行比較,循環(huán)向中間靠攏,根據(jù)情況調(diào)用
patchVnode
進(jìn)行patch
重復(fù)流程、調(diào)用createElem
創(chuàng)建一個(gè)新節(jié)點(diǎn),從哈希表尋找key
一致的VNode
節(jié)點(diǎn)再分情況操作
- 設(shè)置新舊
關(guān)于Vue中el,template,render,$mount的渲染
渲染根節(jié)點(diǎn):
- 先判斷有無(wú)el屬性,有的話直接獲取el根節(jié)點(diǎn),沒(méi)有的話調(diào)用$mount去獲取根節(jié)點(diǎn)。
渲染模板:
- 有render:這時(shí)候優(yōu)先執(zhí)行render函數(shù),render優(yōu)先級(jí) > template。
- 無(wú)render:有template時(shí)拿template去解析成render函數(shù)的所需的格式,并使用調(diào)用render函數(shù)渲染。無(wú)template時(shí)拿el根節(jié)點(diǎn)的outerHTML去解析成render函數(shù)的所需的格式,并使用調(diào)用render函數(shù)渲染
渲染的方式:無(wú)論什么情況,最后都統(tǒng)一是要使用render函數(shù)渲染
以上就是vue面試之new Vue的時(shí)候到底做了什么的詳細(xì)內(nèi)容,更多關(guān)于vue面試new vue的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Vue中的Computed實(shí)現(xiàn)原理分析
這篇文章主要介紹了Vue中的Computed實(shí)現(xiàn)原理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08vue-simple-verify實(shí)現(xiàn)滑動(dòng)驗(yàn)證碼功能
登錄頁(yè)面經(jīng)常會(huì)需要滑動(dòng)驗(yàn)證碼的情況,使用vue插件vue-simple-verify就可以輕松實(shí)現(xiàn),下面小編給大家分享vue-simple-verify實(shí)現(xiàn)滑動(dòng)驗(yàn)證碼功能,感興趣的朋友一起看看吧2024-06-06vue實(shí)現(xiàn)氣泡運(yùn)動(dòng)撞擊效果
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)氣泡運(yùn)動(dòng)撞擊效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08vue,uniapp--js禁止頁(yè)面滾動(dòng),取消滾動(dòng)方式
這篇文章主要介紹了vue,uniapp--js禁止頁(yè)面滾動(dòng),取消滾動(dòng)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05解決Vue項(xiàng)目中tff報(bào)錯(cuò)的問(wèn)題
這篇文章主要介紹了解決Vue項(xiàng)目中tff報(bào)錯(cuò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10前端Vue頁(yè)面中展示本地圖片簡(jiǎn)單代碼示例
今天遇到一個(gè)在vue文件中引入本地圖片的問(wèn)題,于是有了這篇文章,本文主要給大家介紹了關(guān)于前端Vue頁(yè)面中展示本地圖片的相關(guān)資料,需要的朋友可以參考下2023-12-12使vue實(shí)現(xiàn)jQuery調(diào)用的兩種方法
這篇文章主要介紹了使vue實(shí)現(xiàn)jQuery調(diào)用的兩種方法 ,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-05-05vue中組件的過(guò)渡動(dòng)畫及實(shí)現(xiàn)代碼
這篇文章主要介紹了vue中組件的過(guò)渡動(dòng)畫,并通過(guò)實(shí)例代碼給大家介紹了過(guò)渡動(dòng)畫的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-11-11Vue3+Vite項(xiàng)目按需自動(dòng)導(dǎo)入配置以及一些常見(jiàn)問(wèn)題修復(fù)
Vite是一種新型前端構(gòu)建工具,能夠顯著提升前端開發(fā)體驗(yàn),下面這篇文章主要給大家介紹了關(guān)于Vue3+Vite項(xiàng)目按需自動(dòng)導(dǎo)入配置以及一些常見(jiàn)問(wèn)題修復(fù)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02