Virtual Dom
vdom 是vue和react的核心
vdom是什么東西,有什么用,為什么會(huì)存在vdom?
vdom如何應(yīng)用,核心API是什么?
diff算法
## 什么是vdom ##
用js模擬DOM結(jié)構(gòu)
DOM變化的對(duì)比,放在JS層來做
提高重繪性能
用js來模擬
{ tag:"ul", attrs:{ id:"list" }, children:[ { tag:"li", attrs:{ className: "item"}, //class是js的保留字,所以用className children:["Item 1"] },{ tag:"li", attrs:{ className: "item"}, children:["Item 2"] } ] }設(shè)計(jì)一個(gè)需求場(chǎng)景,渲染一個(gè)數(shù)組成表格
//Jquery的實(shí)現(xiàn)Document
上述辦法遇到的問題
js原生或者是Jquery框架時(shí)代,都是直接操作DOM節(jié)點(diǎn)來進(jìn)行渲染頁面,可是這樣的代價(jià)確實(shí)是很大,需要將原本的DOM全部清除,然后在重新渲染一遍
操作Dom非常昂貴。每個(gè)Dom自帶了太多的屬性。 js運(yùn)行效率高
盡量減少Dom操作
項(xiàng)目越復(fù)雜,運(yùn)行效率越低,影響越嚴(yán)重
vdom 可以解決這個(gè)問題,將Dom操作方在Js層,提高效率
vdom如何應(yīng)用,核心API
snabbdom
為什么是snabbdom.js
由于虛擬dom有那么多的好處而且現(xiàn)代前端框架中react和vue均不同程度的使用了虛擬dom的技術(shù),因此通過一個(gè)簡單的 庫賴學(xué)習(xí)虛擬dom技術(shù)就十分必要了,至于為什么會(huì)選擇snabbdom.js這個(gè)庫呢?原因主要有兩個(gè):
源碼簡短,總體代碼行數(shù)不超過500行。
著名的vue的虛擬dom實(shí)現(xiàn)也是參考了snabbdom.js的實(shí)現(xiàn)。
用snabbdomjs 實(shí)現(xiàn)上述例子
Document
//修改數(shù)據(jù)只是修改了 第二個(gè)item 第三,第一個(gè)數(shù)據(jù)沒變化(F12查看Element 第一個(gè)item沒有閃爍)
diff算法什么是diff算法
去繁就簡
vdom 為何用diff算法
diff算法的實(shí)現(xiàn)流程
diff命令是linux系統(tǒng)自帶的基礎(chǔ)命令
git diff 判斷文本文件哪里被修改了
diff算法一直都在,并不是因?yàn)閞eact、vue才出現(xiàn)的
DOM 操作是昂貴的,因此盡量減少DOM操作
找出本次DOM必須更新的節(jié)點(diǎn)來更新,其他的不更新
這個(gè)找出的過程,就需要diff算法
diff實(shí)現(xiàn)過程只需要明白
path(container,vnode)
path(vnode,newnode)
通過VNode創(chuàng)建一個(gè)真實(shí)的DOM的流程
function createElement(vnode){ var tag= vnode.tag var attrs = vnode.attrs||{} var children = vnode.children || [] if(!tag){ return null } var elem = document.createElement(tag) var attrName for(attrName in attrs){ if(attrs.hasOwnProperty(attrName)){ elem.setAttribute(attrName,attrs[attrName]) } } children.forEach(childNode => { elem.appendChild(createElement(childNode)) }); //返回真實(shí)的Dom return elem }
path(vnode,newVnode) 的實(shí)現(xiàn),
function updateChildren(vnode,newVnode){ var children = vnode.children || [] var newChildren = newVnode.children || [] //遍歷現(xiàn)有的children children.forEach((child,index )=> { var newChild = newChildren[index] if(newChild == null){ return } if(child.tag === newChild.tag){ updateChildren(child,newChild) }else{ replaceNode(child,newChild) } }); } function replaceNode(vnode,newVnode){ var elem = vnode.elem var newElem = createElement(newVnode) }
不僅僅是以上的內(nèi)容,還有以下的內(nèi)容
節(jié)點(diǎn)新增和刪除
節(jié)點(diǎn)重新排序
節(jié)點(diǎn)屬性、樣式、事件綁定
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/103858.html
摘要:為此也做了一些學(xué)習(xí)簡單的侃一侃虛擬到底是什么虛擬詳解二什么是虛擬虛擬首次產(chǎn)生是框架最先提出和使用的,其卓越的性能很快得到廣大開發(fā)者的認(rèn)可,繼之后也在其核心引入了虛擬的概念。所謂的虛擬到底是什么也就是通過語言來描述一段代碼。 隨著Vue和React的風(fēng)聲水起,伴隨著諸多框架的成長,虛擬DOM漸漸成了我們經(jīng)常議論和討論的話題。什么是虛擬DOM,虛擬DOM是如何渲染的,那么Vue的虛擬Dom...
摘要:什么是虛擬舉例說明如果網(wǎng)頁中有一個(gè)表格,表頭是姓名,年級(jí),分?jǐn)?shù)。即我們用虛擬的結(jié)構(gòu)替換需要處理的結(jié)構(gòu),對(duì)虛擬的進(jìn)行操作之后再進(jìn)行渲染,就成為了真實(shí)的數(shù)據(jù)。當(dāng)狀態(tài)變更的時(shí)候用修改后的新渲染的的對(duì)象和舊的虛擬對(duì)象作對(duì)比,記錄著兩棵樹的差異。 虛擬DOM 可以看看這個(gè)文章如何理解虛擬DOM? - 戴嘉華的回答 - 知乎 https://www.zhihu.com/questio... 深度剖...
摘要:什么是虛擬舉例說明如果網(wǎng)頁中有一個(gè)表格,表頭是姓名,年級(jí),分?jǐn)?shù)。即我們用虛擬的結(jié)構(gòu)替換需要處理的結(jié)構(gòu),對(duì)虛擬的進(jìn)行操作之后再進(jìn)行渲染,就成為了真實(shí)的數(shù)據(jù)。當(dāng)狀態(tài)變更的時(shí)候用修改后的新渲染的的對(duì)象和舊的虛擬對(duì)象作對(duì)比,記錄著兩棵樹的差異。 虛擬DOM 可以看看這個(gè)文章如何理解虛擬DOM? - 戴嘉華的回答 - 知乎 https://www.zhihu.com/questio... 深度剖...
摘要:的一個(gè)突出特點(diǎn)是擁有極速地渲染性能。該功能依靠的就是研發(fā)團(tuán)隊(duì)弄出的虛擬機(jī)制以及其獨(dú)特的算法。在的算法下,在同一位置對(duì)比前后節(jié)點(diǎn)只要發(fā)現(xiàn)不同,就會(huì)刪除操作前的節(jié)點(diǎn)包括其子節(jié)點(diǎn),替換為操作后的節(jié)點(diǎn)。 React的一個(gè)突出特點(diǎn)是擁有極速地渲染性能。該功能依靠的就是facebook研發(fā)團(tuán)隊(duì)弄出的虛擬dom機(jī)制以及其獨(dú)特的diff算法。下面簡單解釋一下react虛擬dom機(jī)制和diff算法的實(shí)現(xiàn)...
摘要:第一篇文章中主要講解了虛擬基本實(shí)現(xiàn),簡單的回顧一下,虛擬是使用數(shù)據(jù)描述的一段虛擬節(jié)點(diǎn)樹,通過函數(shù)生成其真實(shí)節(jié)點(diǎn)。并添加到其對(duì)應(yīng)的元素容器中。在創(chuàng)建真實(shí)節(jié)點(diǎn)的同時(shí)并為其注冊(cè)事件并添加一些附屬屬性。 第一篇文章中主要講解了虛擬DOM基本實(shí)現(xiàn),簡單的回顧一下,虛擬DOM是使用json數(shù)據(jù)描述的一段虛擬Node節(jié)點(diǎn)樹,通過render函數(shù)生成其真實(shí)DOM節(jié)點(diǎn)。并添加到其對(duì)應(yīng)的元素容器中。在創(chuàng)建...
閱讀 1387·2021-11-25 09:43
閱讀 3608·2021-11-10 11:48
閱讀 5190·2021-09-23 11:21
閱讀 1613·2019-08-30 15:55
閱讀 3523·2019-08-30 13:53
閱讀 1251·2019-08-30 10:51
閱讀 883·2019-08-29 14:20
閱讀 1989·2019-08-29 13:11