雖然採用的是文件碎片,但是操作的還是真實的dom。
而我們知道操作dom的代價是昂貴的,所以vue2.0採用了虛擬dom來代替對真實dom的操作,最後通過某種機制來完成對真實dom的更新,渲染檢視。
所謂的虛擬dom,其實就是用js來模擬dom結構,把dom的變化操作放在js層來做,儘量減少對dom的操作(個人認為主要是因為操作js比操作dom快了不知道多少倍,js執行效率高)。然後對比前後兩次的虛擬dom的變化,只重新渲染變化了的部分,而沒有變化的部分則不會重新渲染。
比如我們有如下的dom結構。
<我們完全可以用js物件模擬上面的dom結構,模擬後就會變成下面的這種結構。ul id
="list"
>
<
li class
="item1"
>item 1
li>
<
li class
="item2"
>item 2
li>
ul>
var vdom =,必須要注意一點的是:js模擬的dom結構並沒有模擬所有dom節點上的屬性、方法(因為dom節點本身的屬性非常多,這也是dom操作耗效能的乙個點),而是只模擬了一部分和資料操作相關的屬性和方法。children: [,},}]}
vue
在2.0
版本引入了vdom
。其vdom
是基於snabbdom庫所做的修改。snabbdom是乙個開源的vdom庫。
snabbdom的主要作用就是將傳入的js模擬的dom結構轉換成虛擬的dom節點。
先通過其中的h函式將js模擬的dom結構
轉換成虛擬dom之後,再通過其中的patch函式將虛擬dom轉換成真實的dom渲染到頁面中。
為了保證頁面的最小化渲染,snabbdom引入了diff演算法,通過diff演算法找出前後兩個虛擬dom之間的差異,只更新改變了的dom節點,而不重新渲染為改變的dom節點。
我會從snabbdom的使用角度來看vue中的虛擬dom是如何完成檢視渲染的。
我們先看一下snabbdom中兩個核心api的功能。
我們提供乙個例項來看一下snabbdom的實際作用。
//定義patch函式
varpatch
=snabbdom.init([
snabbdom_class,
snabbdom_props,
snabbdom_style,
snabbdom_eventlisteners
])//定義h函式
varh
=snabbdom.h;
//生成乙個vnode
varvnode =h(
'ul#list
',{},[
h('li.item
',{},[
'item 1
']),
h('li.item
',{},[
'item 2
']),
])//獲取container
varcontainer
=document.getelementbyid(
'container');
patch(container,vnode);
//初次渲染
varbtn
=document.getelementbyid(
'btn-change');
btn.onclick
=function
() ,[
h('li.item
',{},[
'item 1
']),
h('li.item
',{},[
'item b
']),
h('li.item
',{},[
'item 3
']),
])patch(vnode,newvnode);
//再次渲染
vnode
=newvnode;
//將修改後的newvnode賦值給vnode
}
script
>
body
>
html
>
思路分析:
vue中的模板解析和渲染的核心就是:通過類似snabbdom的h()和patch()的函式,先將模板解析成vnode,如果是初次渲染,則通過patch(container,vnode)將vnode渲染至頁面,如果是二次渲染,則通過patch(vnode,newvnode),先通過diff演算法比較原vnode和newvnode的差異,以最小的代價重新渲染頁面。
vue 的 virtual dom 實現 - snabbdom 解密
一起理解 virtual dom
virtual-dom(vue實現)簡析
解析vue2.0的diff演算法
vue為什麼要用vdom?
vue2 0使用預渲染
檔案目錄如下 執行後如下圖 首頁的網路請求只有乙個,沒有對應的文字和元件,不利於seo 1.router的模式必須是history 2.核心外掛程式 npm install prerender spa plugin d 3.在build webpack.prod.conf.js內部引入渲染器 con...
手寫Vue2 0原始碼 渲染更新原理
此篇主要手寫 vue2.0 原始碼 渲染更新原理 採用觀察者模式 定義 watcher 和 dep 完成依賴收集和派發更新 從而實現渲染更新.適用人群 沒時間去看官方原始碼或者看原始碼看的比較懵而不想去看的同學 1.定義 watcher src observer watcher.js 全域性變數id...
手寫Vue2 0原始碼 渲染更新原理
此篇主要手寫 vue2.0 原始碼 渲染更新原理 採用觀察者模式 定義 watcher 和 dep 完成依賴收集和派發更新 從而實現渲染更新.適用人群 沒時間去看官方原始碼或者看原始碼看的比較懵而不想去看的同學 1.定義 watcher src observer watcher.js 全域性變數id...