JS前端開(kāi)發(fā)模擬虛擬dom轉(zhuǎn)真實(shí)dom詳解
引言
經(jīng)常使用Vue或React的小伙伴肯定對(duì)虛擬dom這個(gè)詞不陌生,虛擬dom的設(shè)計(jì)是推進(jìn)前端框架發(fā)展的一大變革。今天帶大家簡(jiǎn)單模擬下虛擬dom轉(zhuǎn)換真實(shí)dom的js設(shè)計(jì)。廢話不說(shuō)了,上車(chē)吧。
虛擬dom的介紹
介紹
虛擬dom本質(zhì)是一段js代碼,用來(lái)模擬dom樹(shù)的結(jié)果。
如下是對(duì)一段虛擬dom模擬真實(shí)dom的例子
真實(shí)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)勢(shì)
- 跨平臺(tái)
- 虛擬dom配合diff算法在快速更新dom的同時(shí),可以減少頁(yè)面的重拍與重繪
- 虛擬dom解放了前端程序員的思想,徹底拋棄了早期大量操作dom的工作,而是將工作重點(diǎn)放在了數(shù)據(jù)和邏輯的設(shè)計(jì)。從此不再被后端程序員嘲笑為切圖崽
缺點(diǎn)
頁(yè)面有大量dom時(shí),性能可能沒(méi)有原生dom效率高。(原因:虛擬dom本質(zhì)還是用js描述dom樹(shù),所以當(dāng)頁(yè)面dom比較多時(shí),js操作與diff算法需要耗費(fèi)額外的性能較大)
虛擬dom轉(zhuǎn)換真實(shí)dom
終于來(lái)到了今天的主角,通過(guò)設(shè)計(jì)虛擬dom轉(zhuǎn)換真實(shí)dom的過(guò)程,可以更加清晰其工作原理和設(shè)計(jì)過(guò)程,同時(shí)也能讓各位在面試中如魚(yú)得水,碼上拈來(lái)。
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)換真實(shí)dom設(shè)計(jì)*/ 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)
效果
總結(jié)
以上是我對(duì)虛擬dom的簡(jiǎn)單總結(jié)和虛擬dom轉(zhuǎn)換方法的設(shè)計(jì),更多關(guān)于JS模擬虛擬dom轉(zhuǎn)真實(shí)dom的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
通過(guò)高德地圖API獲得某條道路上的所有坐標(biāo)用于描繪道路的方法
這篇文章主要介紹了通過(guò)高德地圖API獲得某條道路上的所有坐標(biāo)用于描繪道路的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08JavaScript實(shí)現(xiàn)谷歌瀏覽器插件開(kāi)發(fā)的方法詳解
對(duì)于瀏覽器插件相信大家都不陌生,誰(shuí)的瀏覽器不裝幾個(gè)好用的插件呢,更是有油猴這個(gè)強(qiáng)大的神器。所以本文就來(lái)用JavaScript開(kāi)發(fā)一個(gè)谷歌瀏覽器插件,感興趣的小伙伴可以了解一下2022-11-11跟我學(xué)習(xí)javascript的基本類型和引用類型
跟我學(xué)習(xí)javascript的基本類型和引用類型,利用圖解的方式,告訴大家javascript的基本類型和引用類型的區(qū)別和聯(lián)系,感興趣的小伙伴們可以參考一下2015-11-11