国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

淺談React的最大亮點之虛擬DOM

2024-05-06 15:33:47
字體:
來源:轉載
供稿:網友

在Web開發中,需要將數據的變化實時反映到UI上,這時就需要對DOM進行操作,但是復雜或頻繁的DOM操作通常是性能瓶頸產生的原因,為此,React引入了虛擬DOM(Virtual DOM)的機制。

一、什么是虛擬DOM?

在React中,render執行的結果得到的并不是真正的DOM節點,結果僅僅是輕量級的JavaScript對象,我們稱之為virtual DOM。

虛擬DOM是React的一大亮點,具有batching(批處理)和高效的Diff算法。這讓我們可以無需擔心性能問題而”毫無顧忌”的隨時“刷新”整個頁面,由虛擬 DOM來確保只對界面上真正變化的部分進行實際的DOM操作。在實際開發中基本無需關心虛擬DOM是如何運作的,但是理解其運行機制不僅有助于更好的理解React組件的生命周期,而且對于進一步優化 React程序也會有很大幫助。

二、虛擬DOM VS 直接操作原生DOM?

如果沒有 Virtual DOM,簡單來說就是直接重置 innerHTML。這樣操作,在一個大型列表所有數據都變了的情況下,還算是合理,但是,當只有一行數據發生變化時,它也需要重置整個 innerHTML,這時候顯然就造成了大量浪費。

比較innerHTML 和Virtual DOM 的重繪過程如下:

innerHTML: render html string + 重新創建所有 DOM 元素

Virtual DOM: render Virtual DOM + diff + 必要的 DOM 更新

和 DOM 操作比起來,js 計算是非常便宜的。Virtual DOM render + diff 顯然比渲染 html 字符串要慢,但是,它依然是純 js 層面的計算,比起后面的 DOM 操作來說,依然便宜了太多。當然,曾有人做過驗證說React的性能不如直接操作真實DOM,代碼如下:

function Raw() {  var data = _buildData(),    html = "";  ...  for(var i=0; i<data.length; i++) {    var render = template;    render = render.replace("{{className}}", "");    render = render.replace("{{label}}", data[i].label);    html += render;  }  ...  container.innerHTML = html;  ...}

該測試用例中雖然構造了一個包含1000個Tag的String,并把它添加到DOM樹中,但是只做了一次DOM操作。然而,在實際開發過程中,這1000個元素更新可能分布在20個邏輯塊中,每個邏輯塊中包含50個元素,當頁面需要更新時,都會引起DOM樹的更新,上述代碼就近似變成了如下格式:

function Raw() {  var data = _buildData(),     html = "";   ...   for(var i=0; i<data.length; i++) {     var render = template;     render = render.replace("{{className}}", "");     render = render.replace("{{label}}", data[i].label);     html += render;     if(!(i % 50)) {      container.innerHTML = html;    }  }   ... }

這樣來看,React的性能就遠勝于原生DOM操作了。

而且,DOM 完全不屬于Javascript (也不在Javascript 引擎中存在).。Javascript 其實是一個非常獨立的引擎,DOM其實是瀏覽器引出的一組讓Javascript操作HTML文檔的API而已。在即時編譯的時代,調用DOM的開銷是很大的。而Virtual DOM的執行完全都在Javascript 引擎中,完全不會有這個開銷。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 富阳市| 股票| 仁布县| 仁怀市| 苏尼特右旗| 黎城县| 伽师县| 丰顺县| 兴业县| 定襄县| 郎溪县| 溧水县| 沁阳市| 武宣县| 子洲县| 施秉县| 晋城| 新密市| 虹口区| 湖口县| 和硕县| 宜兴市| 慈利县| 昌乐县| 沽源县| 牡丹江市| 馆陶县| 宜春市| 汝阳县| 梁河县| 彰化县| 南皮县| 萨嘎县| 当阳市| 丹江口市| 江门市| 平昌县| 宝鸡市| 东乡族自治县| 旌德县| 安达市|