日韩精品亚洲精品中文字幕乱伦AV|曰韩区二区三区日韩中文字幕五码|ady99久久人人看人人摸人人|动漫一区二区黄99精品视频在线|AV片在线观看亚洲中文国产精品|伦乱在线VA欧美性爱一二区|亚洲无码mv91热色视频|激情六月综合欧美精品中文

當(dāng)前位置:首頁 > 軟件開放 > 正文內(nèi)容

vue源碼全方位解析百度云(vue源碼分析視頻教程)

軟件開放2年前 (2023-02-14)1072

本篇文章給大家談?wù)剉ue源碼全方位解析百度云,以及vue源碼分析視頻教程對應(yīng)的知識點,希望對各位有所幫助,不要忘了收藏本站喔。

本文目錄一覽:

【面試題解析】從 Vue 源碼分析 key 的作用

最近看了面試題中有一個這樣的題, v-for 為什么要綁定 key?

Vue 中 key 很多人都弄不清楚有什么作用,甚至還有些人認(rèn)為不綁定 key 就會報錯。

其實沒綁定 key 的話,Vue 還是可以正常運(yùn)行的,報警告是因為沒通過 Eslint 的檢查。

接下來將通過源碼一步步分析這個 key 的作用。

Virtual DOM 最主要保留了 DOM 元素的層級關(guān)系和一些基本屬性,本質(zhì)上就是一個 JS 對象。相對于真實的 DOM,Virtual DOM 更簡單,操作起來速度更快。

如果需要改變 DOM,則會通過新舊 Virtual DOM 對比,找出需要修改的節(jié)點進(jìn)行真實的 DOM 操作,從而減小性能消耗。

傳統(tǒng)的 Diff 算法需要遍歷一個樹的每個節(jié)點,與另一棵樹的每個節(jié)點對比,時間復(fù)雜度為 O(n2)。

Vue 采用的 Diff 算法則通過逐級對比,大大降低了復(fù)雜性,時間復(fù)雜度為 O(n)。

VNode 更新首先會經(jīng)過 patch 函數(shù), patch 函數(shù)源碼如下:

vnode 表示更新后的節(jié)點,oldVnode 表示更新前的節(jié)點,通過對比新舊節(jié)點進(jìn)行操作。

1、vnode 未定義,oldVnode 存在則觸發(fā) destroy 的鉤子函數(shù)

2、oldVnode 未定義,則根據(jù) vnode 創(chuàng)建新的元素

3、oldVnode 不為真實元素并且 oldVnode 與 vnode 為同一節(jié)點,則會調(diào)用 patchVnode 觸發(fā)更新

4、oldVnode 為真實元素或者 oldVnode 與 vnode 不是同一節(jié)點,另做處理

接下來會進(jìn)入 patchVnode 函數(shù),源碼如下:

1、vnode 的 text 不存在,則會比對 oldVnode 與 vnode 的 children 節(jié)點進(jìn)行更新操作

2、vnode 的 text 存在,則會修改 DOM 節(jié)點的 text

接下來在 updateChildren 函數(shù)內(nèi)就可以看到 key 的用處。

key 的作用主要是給 VNode 添加唯一標(biāo)識,通過這個 key,可以更快找到新舊 VNode 的變化,從而進(jìn)一步操作。

key 的作用主要表現(xiàn)在以下這段源碼中。

updateChildren 過程為:

1、分別用兩個指針(startIndex, endIndex)表示 oldCh 和 newCh 的頭尾節(jié)點

2、對指針?biāo)鶎?yīng)的節(jié)點做一個兩兩比較,判斷是否屬于同一節(jié)點

3、如果4種比較都沒有匹配,那么判斷是否有 key,有 key 就會用 key 去做一個比較;無 key 則會通過遍歷的形式進(jìn)行比較

4、比較的過程中,指針往中間靠,當(dāng)有一個 startIndex endIndex,則表示有一個已經(jīng)遍歷完了,比較結(jié)束

從 VNode 的渲染過程可以得知,Vue 的 Diff 算法先進(jìn)行的是同級比較,然后再比較子節(jié)點。

子節(jié)點比較會通過 startIndex、endIndex 兩個指針進(jìn)行兩兩比較,再通過 key 比對子節(jié)點。如果沒設(shè)置 key,則會通過遍歷的方式匹配節(jié)點,增加性能消耗。

所以不綁定 key 并不會有問題,綁定 key 之后在性能上有一定的提升。

綜上,key 主要是應(yīng)用在 Diff 算法中,作用是為了更快速定位出相同的新舊節(jié)點,盡量減少 DOM 的創(chuàng)建和銷毀的操作。

希望以上內(nèi)容能夠?qū)Ω魑恍』锇橛兴鶐椭4蠹颐嬖図樌?/p>

Vue 的文檔中對 key 的說明如下:

關(guān)于就地修改,關(guān)鍵在于 sameVnode 的實現(xiàn),源碼如下:

可以看出,當(dāng) key 未綁定時,主要通過元素的標(biāo)簽等進(jìn)行判斷,在 updateChildren 內(nèi)會將 oldStartVnode 與 newStartVnode 判斷為同一節(jié)點。

如果 VNode 中只包含了文本節(jié)點,在 patchVnode 中可以直接替換文本節(jié)點,而不需要移動節(jié)點的位置,確實在不綁定 key 的情況下效率要高一丟丟。

某些情況下不綁定 key 的效率更高,那為什么大部分Eslint的規(guī)則還是要求綁定 key 呢?

因為在實際項目中,大多數(shù)情況下 v-for 的節(jié)點內(nèi)并不只有文本節(jié)點,那么 VNode 的字節(jié)點就要進(jìn)行銷毀和創(chuàng)建的操作。

相比替換文本帶來的一丟丟提升,這部分會消耗更多的性能,得不償失。

了解了就地修改,那么我們在一些簡單節(jié)點上可以選擇不綁定 key,從而提高性能。

如果你喜歡我的文章,希望可以關(guān)注一下我的公眾號【前端develop】

Vue3入口文件解析

vue作為漸進(jìn)式的前端框架,當(dāng)我們僅僅在H5頁面中輕量引入的時候會這樣寫:

const { createApp, reactive} = Vue;

那么我們是如何導(dǎo)出這些對象的呢?讓我們來看一下 vue.global.js 文件源碼:

看懂了這個函數(shù),其實也就明白了我們是怎么獲取到對象的,這其實是一個 立即加載函數(shù) 。

手把手教你讀Vue2源碼-2

在上一篇中,我們已經(jīng)學(xué)習(xí)了怎么搭建環(huán)境和查找入口文件、vue初始化方法

這一篇,我們就來學(xué)習(xí)基本的調(diào)試方法,在上篇中,我們已經(jīng)在test文件夾中創(chuàng)建了一個測試文件,我們在瀏覽器中打開這個文件

1. 初始化new Vue()

test1.html文件中在初始化app處打斷點,按F11走下一步查看,可以看到進(jìn)入到我們Vue構(gòu)造函數(shù),調(diào)用了init方法

2. this.init(options)

同樣打上斷點,點擊下一步,會進(jìn)入init方法

3. this.initMixin

在init方法,初始化了各種屬性。我們將斷點打在合并options的位置,查看一下options合并前后有什么差別:

4. $mount

繼續(xù),將斷點打到mount方法

5. mountComponent

聲明了updateComponent,創(chuàng)建了Watcher

6. _render()

_render獲取虛擬dom

7. _update()

_update把虛擬dom轉(zhuǎn)為真實dom

關(guān)于vue源碼全方位解析百度云和vue源碼分析視頻教程的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。

掃描二維碼推送至手機(jī)訪問。

版權(quán)聲明:本文由飛速云SEO網(wǎng)絡(luò)優(yōu)化推廣發(fā)布,如需轉(zhuǎn)載請注明出處。

本文鏈接:http://www.atlasseeker.com/post/8385.html

“vue源碼全方位解析百度云(vue源碼分析視頻教程)” 的相關(guān)文章

oa軟件開發(fā)(oa軟件開發(fā)語言)

oa軟件開發(fā)(oa軟件開發(fā)語言)

今天給各位分享oa軟件開發(fā)的知識,其中也會對oa軟件開發(fā)語言進(jìn)行解釋,如果能碰巧解決你現(xiàn)在面臨的問題,別忘了關(guān)注本站,現(xiàn)在開始吧!本文目錄一覽: 1、淺談OA系統(tǒng)二次開發(fā)的優(yōu)劣 2、oa系統(tǒng)開發(fā)深圳哪家比較好?不知有沒有專業(yè)做OA軟件開發(fā)的公司? 3、淺談OA系統(tǒng)的二次開發(fā) 4、開發(fā)OA...

蘋果怎么允許軟件訪問位置(蘋果怎么允許軟件訪問位置呢)

蘋果怎么允許軟件訪問位置(蘋果怎么允許軟件訪問位置呢)

今天給各位分享蘋果怎么允許軟件訪問位置的知識,其中也會對蘋果怎么允許軟件訪問位置呢進(jìn)行解釋,如果能碰巧解決你現(xiàn)在面臨的問題,別忘了關(guān)注本站,現(xiàn)在開始吧!本文目錄一覽: 1、蘋果手機(jī)如何讓原本不訪問位置信息的軟件訪問位置信息? 2、iphone 如何設(shè)置軟件訪問網(wǎng)絡(luò)權(quán)限呢 3、蘋果如何設(shè)置訪問...

qrs間期正常值是多少(qrs時間為多少正常值)

qrs間期正常值是多少(qrs時間為多少正常值)

本篇文章給大家談?wù)剄rs間期正常值是多少,以及qrs時間為多少正常值對應(yīng)的知識點,希望對各位有所幫助,不要忘了收藏本站喔。 本文目錄一覽: 1、請問p/QRS/T電軸正常是多少 2、心電圖正常值 3、心電圖的p-R間期正常值是多少? 請問p/QRS/T電軸正常是多少 哦,從數(shù)據(jù)上看還是正常...

如何修改apk安裝包安裝路徑(手機(jī)如何更改安裝包安裝路徑)

如何修改apk安裝包安裝路徑(手機(jī)如何更改安裝包安裝路徑)

今天給各位分享如何修改apk安裝包安裝路徑的知識,其中也會對手機(jī)如何更改安裝包安裝路徑進(jìn)行解釋,如果能碰巧解決你現(xiàn)在面臨的問題,別忘了關(guān)注本站,現(xiàn)在開始吧!本文目錄一覽: 1、如何更改安裝默認(rèn)路徑 2、如何修改apk游戲文件 3、安裝軟件如何更改路徑? 4、如何修改apk 數(shù)據(jù)包路徑...

去水印小程序源碼springboot(去水印小程序源碼個人)

去水印小程序源碼springboot(去水印小程序源碼個人)

本篇文章給大家談?wù)勅ニ⌒〕绦蛟创aspringboot,以及去水印小程序源碼個人對應(yīng)的知識點,希望對各位有所幫助,不要忘了收藏本站喔。 本文目錄一覽: 1、從零開始學(xué)SpringBoot之SpringBoot WebSocket原理篇 2、Springboot初始化流程解析 3、[Sprin...

autojs源碼(autojs源碼提取器)

autojs源碼(autojs源碼提取器)

今天給各位分享autojs源碼的知識,其中也會對autojs源碼提取器進(jìn)行解釋,如果能碰巧解決你現(xiàn)在面臨的問題,別忘了關(guān)注本站,現(xiàn)在開始吧!本文目錄一覽: 1、手機(jī)autojs 怎樣host跳過活著屏蔽廣告源碼 2、大量autojs常用代碼介紹以及示例 3、Autojs微信自動操作免root...