從原始碼角度解析Vue重排與重繪

2021-10-09 04:37:20 字數 1155 閱讀 3613

眾所周知,vue通過資料繫結來修改檢視,當某個資料被修改的時候,set方法會讓閉包中的dep呼叫notify通知所有訂閱者watcherwatcher通過get方法執行vm._update(...),進而去更新檢視。

vm._update(...)中,vue會呼叫patch(...)(vdom/patch.js第659行左右),將新產生的vnode與資料未變更之前的舊的prevvnode進行對比。

patch(...)方法中,vue通過samevnode(...)(vdom/patch.js第42行左右)對新舊兩個vnode物件進行比較,通過比對它們的標籤名(tag)、鍵值(key)、是否都擁有data選項(isdef(data))以及是否都為注釋節點(iscomment)來確定這兩個vnode對映的真實dom節點為同乙個。只有確定它們是同乙個真實dom節點的不同對映時,才會執行下一步patchvnode(...)(vdom/patch.js第501行左右)。

patchvnode(...)中,vue會依據新舊兩個vnode物件是否擁有子節點children執行不同的dom操作,當兩個vnode物件都有子節點時,會呼叫updatechildren(...)(vdom/patch.js第501行左右)方法遞迴的對子節點進行patchvnode(...)

請注意,diff演算法是乙個使用了遞迴思想的演算法,但是它的時間複雜度只有o(n),這是因為,每乙個舊的vnode只跟與它同層的對映為同乙個真實dom節點的新vnode進行比較

從原始碼角度來看UVM phase

說到uvm phase我們就知道是uvm乙個很重要的特性,從使用者角度來講,其實就是一些很簡單的應用規則,能夠極大地提公升編碼的效率,簡化 複雜度,提高debug的效率。至於應用可以參看zhangqiang大佬的第五章,這裡就不再贅述。本文就從原始碼的角度來看,uvm的phase是怎麼工作的?之前學...

Vue原始碼解析

原始碼位置 src core vdom patch.js updatechildren 作用 key的主要作用是高效的更新虛擬dom,原始碼中在patch的過程中,會執行patchvnode,patchvode過程中會執行updatechildren方法,會更新兩個新舊的子元素,通過key可以準確的...

從原始碼的角度理解Volley

今天從原始碼的角度來理解一下volley中部分功能的實現。新增請求到請求佇列 將請求新增到請求佇列中 public requestadd requestrequest 為請求設定順序編號.request.setsequence getsequencenumber 新增標記 request.addma...