摘要:當正在更新使用渲染的元素列表時,它默認使用就地更新的策略。如果數據項的順序被改變,將不會移動。避免對節點就地復用需要修改的節點位置沒有改變,是內容更新了,這雖然提高了復用性能,但是往往在復雜的表單會導致狀態出現錯位。
當 Vue 正在更新使用 v-for 渲染的元素列表時,它默認使用“就地更新”的策略。如果數據項的順序被改變,Vue 將不會移動 DOM。 元素來匹配數據項的順序,而是就地更新每個元素,并且確保它們在每個索引位置正確渲染。這個類似 Vue 1.x 的 track-by="$index"。
這個默認的模式是高效的,但是只適用于不依賴子組件狀態或臨時 DOM 狀態 (例如:表單輸入值) 的列表渲染輸出。
避免對節點「就地復用」
需要修改的節點位置沒有改變,是內容更新了,這雖然提高了復用性能,但是往往在復雜的表單會導致狀態出現錯位。也不會產生過度效果
key相當于每個vnode 的唯一id,我們可以依靠key,更快更精確的知道oldVnode中對應的vnode節點。
帶key就不會使用就定復用了,在sameNode函數a.key===b.key對比中可以避免就地復用的情況。
我們可以利用key的唯一性來更快獲取到對應節點,比遍歷更快。
什么是diff算法?要渲染真實的DOM的開銷很大,因為改變真實dom,會當值整個dom樹的重繪和回流。我們需要渲染真實dom的時候往往會把生成一個虛擬節點 virtual DOM,當virtual dom某個節點的數據改變后生成一個新的Vnode,然后將Vnode和oldVnode對比,當然有不同的地方教就直接修改在真實DOM上,然后是oldVnode=Vnode
真實DOM
123
virtual DOM (虛擬DOM)
var Vnode={ tag:"div", children:[{ tag:"p",text:"123" }] }diff的比較方式
在同層級進行,不會跨層級比較
oldDOM
123
newDOM
2222
先對比DIV,發現兩個DIV不對等
查看DIV的子元素P、SPAN,發現不對等
查看P、SPAN沒有子元素,則移除P,增加SPAN
現在我們來看看在進行替換
對比節點函數function patch(oldVnode, vnode) { // 對比是否相等 if (sameVnode(oldVnode, vnode)) { patchVnode(oldVnode, vnode) } else { const oEl = oldVnode.el // 當前oldVnode對應的真實元素節點 let parentEle = api.parentNode(oEl) // 父元素 createELe(vnode) // 為vnode生成新的元素 if (parentEle !== null) { api.insertBefore(parentEle, vnode.el, api.nextSibling(oEl)) // 將新的元素添加到父元素中 api.removeChild(parentEle, oldVnode.el) // 移除以前的元素 } } return vnode }判斷兩者是否相同函數
function sameVnode(a, b) { return ( a.key === b.key && // 對比key a.tag === b.tag && // 對比標簽名 a.isComment === b.isComment && // 是否為注釋節點 isDef(a.data) === isDef(b.data) && // 是否定義了data,或者其他屬性 sameInputType(a, b) //判斷是當時 是否type相同 ) }
匹配規則
將Vnode的子節點Vch和oldVnode的子節點oldCh提取出來
oldCh和vCh各有兩個頭尾的變量StartIdx和EndIdx,它們的2個變量相互比較,一共有4種比較方式。如果4種比較都沒匹配,如果設置了key,就會用key進行比較,在比較的過程中,變量會往中間靠,一旦StartIdx>EndIdx表明oldCh和vCh至少有一個已經遍歷完了,就會結束比較。
圖解
如果oldS和E匹配上了,那么真實DOM中的第一個節點會移到最后
如果oldE和S匹配上了,那么真實DOM中的最后一個節點會移到最后面,匹配上的兩個指針向中間移動
如果四種匹配都沒有一對成功成功的,那么遍歷oldChild,S挨個和他們匹配,匹配成功就在真實dom中講成功的節點移到最前面,如果沒有成功,那么犟S對應的節點插入dom中對應的olds位置,olds和s指正向中間移動
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/105965.html
摘要:解析第題第題為什么的和的中不能做異步操作解析第題第題京東下面代碼中在什么情況下會打印解析第題第題介紹下及其應用。盡量減少操作次數。解析第題第題京東快手周一算法題之兩數之和給定一個整數數組和一個目標值,找出數組中和為目標值的兩個數。 引言 半年時間,幾千人參與,精選大廠前端面試高頻 100 題,這就是「壹題」。 在 2019 年 1 月 21 日這天,「壹題」項目正式開始,在這之后每個工...
摘要:當一個組件沒有聲明任何時,這里會包含所有父作用域的綁定和除外,并且可以通過傳入內部組件在創建高級別的組件時非常有用。 寫在前面 組件間的通信是是實際開發中非常常用的一環,如何使用對項目整體設計、開發、規范都有很實際的的作用,我在項目開發中對此深有體會,總結下vue組件間通信的幾種方式,討論下各自的使用場景 文章對相關場景預覽 父->子組件間的數據傳遞 子->父組件間的數據傳遞 兄弟...
摘要:在寫法上最常見的兩種命名分別為和。下面列出了一些約定成俗的適用例子提交表單處理分頁頁數改變處理分頁每頁大小改變按下鍵場景二異步處理這里主要是指在寫數據層服務狀態管理中的命名,以及回調的命名規則。 JavaScript作為前端開發從業人員必須掌握的3大基礎知識中最重要的一環,也是平是接觸時間最長、寫得最多的。在開發過程中必然會遇到命名的問題,你會詞窮、糾結、惆悵嗎?本文的出現相信能夠解決...
摘要:并總結經典面試題集各種算法和插件前端視頻源碼資源于一身的文檔,優化項目,在瀏覽器端的層面上提升速度,幫助初中級前端工程師快速搭建項目。 本文是關注微信小程序的開發和面試問題,由基礎到困難循序漸進,適合面試和開發小程序。并總結vue React html css js 經典面試題 集各種算法和插件、前端視頻源碼資源于一身的文檔,優化項目,在瀏覽器端的層面上提升速度,幫助初中級前端工程師快...
閱讀 3214·2021-11-19 09:40
閱讀 3010·2021-09-09 09:32
閱讀 799·2021-09-02 09:55
閱讀 1401·2019-08-26 13:23
閱讀 2414·2019-08-26 11:46
閱讀 1237·2019-08-26 10:19
閱讀 2065·2019-08-23 16:53
閱讀 1077·2019-08-23 12:44