Virtual Dom
vdom 是vue和react的核心
vdom是什么東西,有什么用,為什么會存在vdom?
vdom如何應用,核心API是什么?
diff算法
## 什么是vdom ##
用js模擬DOM結構
DOM變化的對比,放在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"] } ] }設計一個需求場景,渲染一個數組成表格
//Jquery的實現Document
上述辦法遇到的問題
js原生或者是Jquery框架時代,都是直接操作DOM節點來進行渲染頁面,可是這樣的代價確實是很大,需要將原本的DOM全部清除,然后在重新渲染一遍
操作Dom非常昂貴。每個Dom自帶了太多的屬性。 js運行效率高
盡量減少Dom操作
項目越復雜,運行效率越低,影響越嚴重
vdom 可以解決這個問題,將Dom操作方在Js層,提高效率
vdom如何應用,核心API
snabbdom
為什么是snabbdom.js
由于虛擬dom有那么多的好處而且現代前端框架中react和vue均不同程度的使用了虛擬dom的技術,因此通過一個簡單的 庫賴學習虛擬dom技術就十分必要了,至于為什么會選擇snabbdom.js這個庫呢?原因主要有兩個:
源碼簡短,總體代碼行數不超過500行。
著名的vue的虛擬dom實現也是參考了snabbdom.js的實現。
用snabbdomjs 實現上述例子
Document
//修改數據只是修改了 第二個item 第三,第一個數據沒變化(F12查看Element 第一個item沒有閃爍)
diff算法什么是diff算法
去繁就簡
vdom 為何用diff算法
diff算法的實現流程
diff命令是linux系統自帶的基礎命令
git diff 判斷文本文件哪里被修改了
diff算法一直都在,并不是因為react、vue才出現的
DOM 操作是昂貴的,因此盡量減少DOM操作
找出本次DOM必須更新的節點來更新,其他的不更新
這個找出的過程,就需要diff算法
diff實現過程只需要明白
path(container,vnode)
path(vnode,newnode)
通過VNode創建一個真實的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)) }); //返回真實的Dom return elem }
path(vnode,newVnode) 的實現,
function updateChildren(vnode,newVnode){ var children = vnode.children || [] var newChildren = newVnode.children || [] //遍歷現有的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) }
不僅僅是以上的內容,還有以下的內容
節點新增和刪除
節點重新排序
節點屬性、樣式、事件綁定
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/103858.html
摘要:為此也做了一些學習簡單的侃一侃虛擬到底是什么虛擬詳解二什么是虛擬虛擬首次產生是框架最先提出和使用的,其卓越的性能很快得到廣大開發者的認可,繼之后也在其核心引入了虛擬的概念。所謂的虛擬到底是什么也就是通過語言來描述一段代碼。 隨著Vue和React的風聲水起,伴隨著諸多框架的成長,虛擬DOM漸漸成了我們經常議論和討論的話題。什么是虛擬DOM,虛擬DOM是如何渲染的,那么Vue的虛擬Dom...
摘要:的一個突出特點是擁有極速地渲染性能。該功能依靠的就是研發團隊弄出的虛擬機制以及其獨特的算法。在的算法下,在同一位置對比前后節點只要發現不同,就會刪除操作前的節點包括其子節點,替換為操作后的節點。 React的一個突出特點是擁有極速地渲染性能。該功能依靠的就是facebook研發團隊弄出的虛擬dom機制以及其獨特的diff算法。下面簡單解釋一下react虛擬dom機制和diff算法的實現...
摘要:第一篇文章中主要講解了虛擬基本實現,簡單的回顧一下,虛擬是使用數據描述的一段虛擬節點樹,通過函數生成其真實節點。并添加到其對應的元素容器中。在創建真實節點的同時并為其注冊事件并添加一些附屬屬性。 第一篇文章中主要講解了虛擬DOM基本實現,簡單的回顧一下,虛擬DOM是使用json數據描述的一段虛擬Node節點樹,通過render函數生成其真實DOM節點。并添加到其對應的元素容器中。在創建...
閱讀 1370·2021-11-25 09:43
閱讀 3582·2021-11-10 11:48
閱讀 5091·2021-09-23 11:21
閱讀 1597·2019-08-30 15:55
閱讀 3508·2019-08-30 13:53
閱讀 1235·2019-08-30 10:51
閱讀 868·2019-08-29 14:20
閱讀 1972·2019-08-29 13:11