回顧
- 虛擬DOM庫 - Snabbdom
- 什么是虛擬DOM
- 虛擬DOM(Virtual Dom )是使用JavaScript對(duì)象描述真實(shí)的DOM
- Vue.js中的虛擬DOM借鑒Snabbdom,并添加了vue.js的特性
- 例如:指令和組件機(jī)制
- 為什么要使用虛擬DOM
- 避免直接操作DOM,提高開發(fā)效率
- 作為一個(gè)中間層可以跨平臺(tái)
- 虛擬DOM不一定可以提高性能 。首次渲染的時(shí)候回增加開銷。復(fù)雜視圖情況下提升渲染性能
一、h函數(shù)
- vm.$createElement(tag,data,children,normalizeChildren)
- tag:標(biāo)簽名稱或者組件對(duì)象
- data:描述tag,可以設(shè)置DOM的屬性或者標(biāo)簽的屬性
- children:tag中的文本內(nèi)容或者子節(jié)點(diǎn)
- h()函數(shù)的返回結(jié)果是VNode
- VNode的核心
- tag:也就是調(diào)用h()函數(shù)時(shí)候傳入的tag
- data:也就是調(diào)用h()函數(shù)時(shí)候傳入的data
- children:也就是調(diào)用h()函數(shù)時(shí)候傳入的children
- text:屬性
- elm:記錄真實(shí)DOM
- key:復(fù)用當(dāng)前的這個(gè)元素
二、整體過程分析

image.png

image.png

image.png

image.png
三、VNode
- 創(chuàng)建過程核心—— createElement
- 處理過程—— update(判斷是否有prevVnode,如果沒有就是首次渲染調(diào)用patch方法傳入vm.$el,如果有prevVNode,說明是數(shù)據(jù)更新的時(shí)候,調(diào)用patch方法傳入oldvnode,和newVnode)
四、patch 函數(shù)
-Snabbdom 中的VNode

image.png
-Snabbdom中的patch

image.png
-
Vue.js 中patch的初始化
src/platforms/web/runtime/index.js
image.png
