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)文章
uni-appx和uni-app的區(qū)別以及該如何選擇詳解
Uniapp?X是DCloud推出的下一代跨平臺(tái)應(yīng)用開發(fā)引擎,基于?TypeScript?和原生渲染技術(shù),性能顯著提升,接近原生應(yīng)用,這篇文章主要介紹了uni-appx和uni-app的區(qū)別以及該如何選擇的相關(guān)資料,需要的朋友可以參考下2025-09-09
vue iview實(shí)現(xiàn)動(dòng)態(tài)路由和權(quán)限驗(yàn)證功能
這篇文章主要介紹了vue iview實(shí)現(xiàn)動(dòng)態(tài)路由和權(quán)限驗(yàn)證功能,動(dòng)態(tài)路由控制分為兩種:一種是將所有路由數(shù)據(jù)存儲(chǔ)在本地文件中,另一種則是本地只存儲(chǔ)基本路由,具體內(nèi)容詳情大家參考下此文2018-04-04
詳解vue-cli中的ESlint配置文件eslintrc.js
本篇文章主要介紹了vue-cli中的ESlint配置文件eslintrc.js詳解 ,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09
ElementUI動(dòng)態(tài)渲染el-table的實(shí)現(xiàn)過(guò)程
在前端開發(fā)中,表格是不可或缺的一部分,無(wú)論是數(shù)據(jù)展示、數(shù)據(jù)錄入,還是數(shù)據(jù)分析,表格都扮演著重要的角色,而在Vue.js生態(tài)系統(tǒng)中,ElementUI提供了一個(gè)強(qiáng)大且靈活的表格組件——el-table,本文將帶你深入了解如何使用ElementUI動(dòng)態(tài)渲染el-table,并詳細(xì)探討其原理及實(shí)現(xiàn)過(guò)程2024-08-08
vue子路由跳轉(zhuǎn)實(shí)現(xiàn)tab選項(xiàng)卡效果
這篇文章主要為大家詳細(xì)介紹了vue子路由跳轉(zhuǎn)實(shí)現(xiàn)tab選項(xiàng)卡效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
從Vuex中取出數(shù)組賦值給新的數(shù)組,新數(shù)組push時(shí)報(bào)錯(cuò)的解決方法
今天小編就為大家分享一篇從Vuex中取出數(shù)組賦值給新的數(shù)組,新數(shù)組push時(shí)報(bào)錯(cuò)的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
vuex 項(xiàng)目結(jié)構(gòu)目錄及一些簡(jiǎn)單配置介紹
這篇文章主要介紹了vuex 項(xiàng)目結(jié)構(gòu)目錄及一些簡(jiǎn)單配置,需要的朋友可以參考下2018-04-04
vue+element實(shí)現(xiàn)下拉菜單并帶本地搜索功能示例詳解
這篇文章主要介紹了vue+element實(shí)現(xiàn)下拉菜單并帶本地搜索功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09

