JS前端開發(fā)模擬虛擬dom轉(zhuǎn)真實dom詳解
引言
經(jīng)常使用Vue或React的小伙伴肯定對虛擬dom這個詞不陌生,虛擬dom的設計是推進前端框架發(fā)展的一大變革。今天帶大家簡單模擬下虛擬dom轉(zhuǎn)換真實dom的js設計。廢話不說了,上車吧。
虛擬dom的介紹
介紹
虛擬dom本質(zhì)是一段js代碼,用來模擬dom樹的結果。
如下是對一段虛擬dom模擬真實dom的例子
真實dom
<div class="box">
<p name="dog">xiao ming</p>
</div>
虛擬dom
let vnode = {
tag:"div",
attrs:{
class:["box"]
},
childrens:[
{
tag:"p",
attrs:{
name:"dog"
},
childrens:[
{
tag:'text',
content:"xiao ming"
}
]
}
]
}
優(yōu)勢
- 跨平臺
- 虛擬dom配合diff算法在快速更新dom的同時,可以減少頁面的重拍與重繪
- 虛擬dom解放了前端程序員的思想,徹底拋棄了早期大量操作dom的工作,而是將工作重點放在了數(shù)據(jù)和邏輯的設計。從此不再被后端程序員嘲笑為切圖崽
缺點
頁面有大量dom時,性能可能沒有原生dom效率高。(原因:虛擬dom本質(zhì)還是用js描述dom樹,所以當頁面dom比較多時,js操作與diff算法需要耗費額外的性能較大)
虛擬dom轉(zhuǎn)換真實dom
終于來到了今天的主角,通過設計虛擬dom轉(zhuǎn)換真實dom的過程,可以更加清晰其工作原理和設計過程,同時也能讓各位在面試中如魚得水,碼上拈來。
const vnode = {
tag: 'DIV',
attrs: {
id: 'app'
},
children: [{
tag: 'SPAN',
children: [{
tag: 'A',
children: []
}]
},
{
tag: 'SPAN',
children: [{
tag: 'A',
children: []
},
{
tag: 'A',
children: []
}
]
}
]
}
/*虛擬dom轉(zhuǎn)換真實dom設計*/
function render(vnode) {
//核心遞歸函數(shù)
const main = (node,parent=null) => {
let ele
ele = document.createElement(node.tag.toLowerCase())
//添加屬性
if(node.attrs) {
for(let key in node.attrs) {
ele.setAttribute(key,node.attrs[key])
}
}
//添加孩子,遞歸
if(node.children && node.children.length) {
for(let val of node.children) {
main(val,ele)
}
}
if(parent) {
parent.appendChild(ele)
}else{
parent = ele
}
return parent
}
let dom = main(vnode)
return dom
}
render(vnode)
效果

總結
以上是我對虛擬dom的簡單總結和虛擬dom轉(zhuǎn)換方法的設計,更多關于JS模擬虛擬dom轉(zhuǎn)真實dom的資料請關注腳本之家其它相關文章!
相關文章
通過高德地圖API獲得某條道路上的所有坐標用于描繪道路的方法
這篇文章主要介紹了通過高德地圖API獲得某條道路上的所有坐標用于描繪道路的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-08-08
JavaScript實現(xiàn)谷歌瀏覽器插件開發(fā)的方法詳解
對于瀏覽器插件相信大家都不陌生,誰的瀏覽器不裝幾個好用的插件呢,更是有油猴這個強大的神器。所以本文就來用JavaScript開發(fā)一個谷歌瀏覽器插件,感興趣的小伙伴可以了解一下2022-11-11

