国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

怎樣使用React虛擬DOM

May 31, 2018 pm 02:22 PM
react 使用 虛擬

這次給大家?guī)?lái)怎樣使用React虛擬DOM,使用React虛擬DOM的注意事項(xiàng)有哪些,下面就是實(shí)戰(zhàn)案例,一起來(lái)看一下。

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

一、什么是虛擬DOM?

在React中,render執(zhí)行的結(jié)果得到的并不是真正的DOM節(jié)點(diǎn),結(jié)果僅僅是輕量級(jí)的JavaScript對(duì)象,我們稱(chēng)之為virtual DOM。

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

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

如果沒(méi)有 Virtual DOM,簡(jiǎn)單來(lái)說(shuō)就是直接重置 innerHTML。這樣操作,在一個(gè)大型列表所有數(shù)據(jù)都變了的情況下,還算是合理,但是,當(dāng)只有一行數(shù)據(jù)發(fā)生變化時(shí),它也需要重置整個(gè) innerHTML,這時(shí)候顯然就造成了大量浪費(fèi)。

比較innerHTML 和Virtual DOM 的重繪過(guò)程如下:

innerHTML: render html string + 重新創(chuàng)建所有 DOM 元素

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

和 DOM 操作比起來(lái),js 計(jì)算是非常便宜的。Virtual DOM render + diff 顯然比渲染 html 字符串要慢,但是,它依然是純 js 層面的計(jì)算,比起后面的 DOM 操作來(lái)說(shuō),依然便宜了太多。當(dāng)然,曾有人做過(guò)驗(yàn)證說(shuō)React的性能不如直接操作真實(shí)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;
  ...
}

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

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;
    }
  } 
  ... 
}

這樣來(lái)看,React的性能就遠(yuǎn)勝于原生DOM操作了。

而且,DOM 完全不屬于Javascript (也不在Javascript 引擎中存在).。Javascript 其實(shí)是一個(gè)非常獨(dú)立的引擎,DOM其實(shí)是瀏覽器引出的一組讓Javascript操作HTML文檔的API而已。在即時(shí)編譯的時(shí)代,調(diào)用DOM的開(kāi)銷(xiāo)是很大的。而Virtual DOM的執(zhí)行完全都在Javascript 引擎中,完全不會(huì)有這個(gè)開(kāi)銷(xiāo)。

React.js 相對(duì)于直接操作原生DOM有很大的性能優(yōu)勢(shì), 很大程度上都要?dú)w功于virtual DOM的batching 和diff。batching把所有的DOM操作搜集起來(lái),一次性提交給真實(shí)的DOM。diff算法時(shí)間復(fù)雜度也從標(biāo)準(zhǔn)的的Diff算法的O(n^3)降到了O(n)。這里留到下一次博客單獨(dú)講。

三、虛擬DOM VS MVVM?

相比起 React,其他 MVVM 系框架比如 Angular, Knockout 以及 Vue、Avalon 采用的都是數(shù)據(jù)綁定:通過(guò) Directive/Binding 對(duì)象,觀察數(shù)據(jù)變化并保留對(duì)實(shí)際 DOM 元素的引用,當(dāng)有數(shù)據(jù)變化時(shí)進(jìn)行對(duì)應(yīng)的操作。MVVM 的變化檢查是數(shù)據(jù)層面的,而 React 的檢查是 DOM 結(jié)構(gòu)層面的。MVVM 的性能也根據(jù)變動(dòng)檢測(cè)的實(shí)現(xiàn)原理有所不同:Angular 的臟檢查使得任何變動(dòng)都有固定的 O(watcher count) 的代價(jià);Knockout/Vue/Avalon 都采用了依賴(lài)收集,在 js 和 DOM 層面都是 O(change):

  1. 臟檢查:scope digest + 必要 DOM 更新

  2. 依賴(lài)收集:重新收集依賴(lài) + 必要 DOM 更新

可以看到,Angular 最不效率的地方在于任何小變動(dòng)都有的和 watcher 數(shù)量相關(guān)的性能代價(jià)。但是!當(dāng)所有數(shù)據(jù)都變了的時(shí)候,Angular 其實(shí)并不吃虧。依賴(lài)收集在初始化和數(shù)據(jù)變化的時(shí)候都需要重新收集依賴(lài),這個(gè)代價(jià)在小量更新的時(shí)候幾乎可以忽略,但在數(shù)據(jù)量龐大的時(shí)候也會(huì)產(chǎn)生一定的消耗。

MVVM 渲染列表的時(shí)候,由于每一行都有自己的數(shù)據(jù)作用域,所以通常都是每一行有一個(gè)對(duì)應(yīng)的 ViewModel 實(shí)例,或者是一個(gè)稍微輕量一些的利用原型繼承的 "scope" 對(duì)象,但也有一定的代價(jià)。所以,MVVM 列表渲染的初始化幾乎一定比 React 慢,因?yàn)閯?chuàng)建 ViewModel / scope 實(shí)例比起 Virtual DOM 來(lái)說(shuō)要昂貴很多。這里所有 MVVM 實(shí)現(xiàn)的一個(gè)共同問(wèn)題就是在列表渲染的數(shù)據(jù)源變動(dòng)時(shí),尤其是當(dāng)數(shù)據(jù)是全新的對(duì)象時(shí),如何有效地復(fù)用已經(jīng)創(chuàng)建的 ViewModel 實(shí)例和 DOM 元素。假如沒(méi)有任何復(fù)用方面的優(yōu)化,由于數(shù)據(jù)是 “全新” 的,MVVM 實(shí)際上需要銷(xiāo)毀之前的所有實(shí)例,重新創(chuàng)建所有實(shí)例,最后再進(jìn)行一次渲染!這就是為什么題目里鏈接的 angular/knockout 實(shí)現(xiàn)都相對(duì)比較慢。相比之下,React 的變動(dòng)檢查由于是 DOM 結(jié)構(gòu)層面的,即使是全新的數(shù)據(jù),只要最后渲染結(jié)果沒(méi)變,那么就不需要做無(wú)用功。

Angular 和 Vue 都提供了列表重繪的優(yōu)化機(jī)制,也就是 “提示” 框架如何有效地復(fù)用實(shí)例和 DOM 元素。比如數(shù)據(jù)庫(kù)里的同一個(gè)對(duì)象,在兩次前端 API 調(diào)用里面會(huì)成為不同的對(duì)象,但是它們依然有一樣的 uid。這時(shí)候你就可以提示 track by uid 來(lái)讓 Angular 知道,這兩個(gè)對(duì)象其實(shí)是同一份數(shù)據(jù)。那么原來(lái)這份數(shù)據(jù)對(duì)應(yīng)的實(shí)例和 DOM 元素都可以復(fù)用,只需要更新變動(dòng)了的部分?;蛘撸阋部梢灾苯?track by $index 來(lái)進(jìn)行 “原地復(fù)用”:直接根據(jù)在數(shù)組里的位置進(jìn)行復(fù)用。在題目給出的例子里,如果 angular 實(shí)現(xiàn)加上 track by $index 的話,后續(xù)重繪是不會(huì)比 React 慢多少的。甚至在 dbmonster 測(cè)試中,Angular 和 Vue 用了 track by $index 以后都比 React 快: dbmon (注意 Angular 默認(rèn)版本無(wú)優(yōu)化,優(yōu)化過(guò)的在下面)

在比較性能的時(shí)候,要分清楚初始渲染、小量數(shù)據(jù)更新、大量數(shù)據(jù)更新這些不同的場(chǎng)合。Virtual DOM、臟檢查 MVVM、數(shù)據(jù)收集 MVVM 在不同場(chǎng)合各有不同的表現(xiàn)和不同的優(yōu)化需求。Virtual DOM 為了提升小量數(shù)據(jù)更新時(shí)的性能,也需要針對(duì)性的優(yōu)化,比如 shouldComponentUpdate 或是 immutable data。

  1. 初始渲染:Virtual DOM > 臟檢查 >= 依賴(lài)收集

  2. 小量數(shù)據(jù)更新:依賴(lài)收集 >> Virtual DOM + 優(yōu)化 > 臟檢查(無(wú)法優(yōu)化) > Virtual DOM 無(wú)優(yōu)化

  3. 大量數(shù)據(jù)更新:臟檢查 + 優(yōu)化 >= 依賴(lài)收集 + 優(yōu)化 > Virtual DOM(無(wú)法/無(wú)需優(yōu)化)>> MVVM 無(wú)優(yōu)化

  4. (該段落借鑒了知乎的相關(guān)回答)

  5. 四、對(duì)React虛擬DOM的誤解?

    React 從來(lái)沒(méi)有說(shuō)過(guò) “React 比原生操作 DOM 快”。React給我們的保證是,在不需要手動(dòng)優(yōu)化的情況下,它依然可以給我們提供過(guò)得去的性能。

    React掩蓋了底層的 DOM 操作,可以用更聲明式的方式來(lái)描述我們目的,從而讓代碼更容易維護(hù)。下面還是借鑒了知乎上的回答:沒(méi)有任何框架可以比純手動(dòng)的優(yōu)化 DOM 操作更快,因?yàn)榭蚣艿?DOM 操作層需要應(yīng)對(duì)任何上層 API 可能產(chǎn)生的操作,它的實(shí)現(xiàn)必須是普適的。針對(duì)任何一個(gè) benchmark,我都可以寫(xiě)出比任何框架更快的手動(dòng)優(yōu)化,但是那有什么意義呢?在構(gòu)建一個(gè)實(shí)際應(yīng)用的時(shí)候,你難道為每一個(gè)地方都去做手動(dòng)優(yōu)化嗎?出于可維護(hù)性的考慮,這顯然不可能。

    相信看了本文案例你已經(jīng)掌握了方法,更多精彩請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!

    推薦閱讀:

    微信小程序內(nèi)實(shí)現(xiàn)上傳圖片附后端代碼

    微信小程序上傳圖片實(shí)戰(zhàn)案例解析

    以上是怎樣使用React虛擬DOM的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

熱門(mén)話題

Laravel 教程
1601
29
PHP教程
1502
276
VUE.JS與React:比較性能和效率 VUE.JS與React:比較性能和效率 Apr 28, 2025 am 12:12 AM

Vue.js和React各有優(yōu)勢(shì):Vue.js適用于小型應(yīng)用和快速開(kāi)發(fā),React適合大型應(yīng)用和復(fù)雜狀態(tài)管理。1.Vue.js通過(guò)響應(yīng)式系統(tǒng)實(shí)現(xiàn)自動(dòng)更新,適用于小型應(yīng)用。2.React使用虛擬DOM和diff算法,適合大型和復(fù)雜應(yīng)用。選擇框架時(shí)需考慮項(xiàng)目需求和團(tuán)隊(duì)技術(shù)棧。

Netflix:探索React(或其他框架)的使用 Netflix:探索React(或其他框架)的使用 Apr 23, 2025 am 12:02 AM

Netflix選擇React來(lái)構(gòu)建其用戶(hù)界面,因?yàn)镽eact的組件化設(shè)計(jì)和虛擬DOM機(jī)制能夠高效處理復(fù)雜界面和頻繁更新。1)組件化設(shè)計(jì)讓Netflix將界面分解成可管理的小組件,提高了開(kāi)發(fā)效率和代碼可維護(hù)性。2)虛擬DOM機(jī)制通過(guò)最小化DOM操作,確保了Netflix用戶(hù)界面的流暢性和高性能。

十大數(shù)字貨幣交易app平臺(tái)有哪些 數(shù)字貨幣交易所平臺(tái)排行榜前十 十大數(shù)字貨幣交易app平臺(tái)有哪些 數(shù)字貨幣交易所平臺(tái)排行榜前十 Apr 22, 2025 pm 02:54 PM

十大數(shù)字貨幣交易app平臺(tái):1. OKX,2. Binance,3. Gate.io,4. Huobi,5. Coinbase,6. Kraken,7. Bitfinex,8. KuCoin,9. Bybit,10. Bitstamp,這些平臺(tái)提供實(shí)時(shí)行情、技術(shù)分析工具和用戶(hù)友好的界面,幫助投資者進(jìn)行有效的市場(chǎng)分析和交易決策。

我如何將CSS與React一起包含? 我如何將CSS與React一起包含? May 26, 2025 am 12:01 AM

在React中包含CSS的方法有五種:1.使用內(nèi)聯(lián)樣式,簡(jiǎn)單但不利于復(fù)用和維護(hù);2.使用CSS文件,通過(guò)導(dǎo)入實(shí)現(xiàn),利于組織但可能導(dǎo)致沖突;3.使用CSSModules,避免全局沖突但需配置;4.使用StyledComponents,利用JavaScript動(dòng)態(tài)生成樣式但需依賴(lài)庫(kù);5.使用Sass或Less,提供更多功能但增加構(gòu)建復(fù)雜性。

vue.js和React的未來(lái):趨勢(shì)和預(yù)測(cè) vue.js和React的未來(lái):趨勢(shì)和預(yù)測(cè) May 09, 2025 am 12:12 AM

Vue.js和React的未來(lái)趨勢(shì)和預(yù)測(cè)分別是:1)Vue.js將在企業(yè)級(jí)應(yīng)用中廣泛應(yīng)用,并在服務(wù)端渲染和靜態(tài)站點(diǎn)生成方面有突破;2)React將在服務(wù)器組件和數(shù)據(jù)獲取方面創(chuàng)新,并進(jìn)一步優(yōu)化并發(fā)模式。

vue.js vs.反應(yīng):用例和應(yīng)用程序 vue.js vs.反應(yīng):用例和應(yīng)用程序 Apr 29, 2025 am 12:36 AM

Vue.js適合小型到中型項(xiàng)目,React適合大型項(xiàng)目和復(fù)雜應(yīng)用場(chǎng)景。1)Vue.js易于上手,適用于快速原型開(kāi)發(fā)和小型應(yīng)用。2)React在處理復(fù)雜狀態(tài)管理和性能優(yōu)化方面更有優(yōu)勢(shì),適合大型項(xiàng)目。

React和Bootstrap:增強(qiáng)用戶(hù)界面設(shè)計(jì) React和Bootstrap:增強(qiáng)用戶(hù)界面設(shè)計(jì) Apr 26, 2025 am 12:18 AM

React和Bootstrap可以無(wú)縫集成來(lái)提升用戶(hù)界面設(shè)計(jì)。1)安裝依賴(lài)包:npminstallbootstrapreact-bootstrap。2)導(dǎo)入CSS文件:import'bootstrap/dist/css/bootstrap.min.css'。3)使用Bootstrap組件,如按鈕和導(dǎo)航欄。通過(guò)這種結(jié)合,開(kāi)發(fā)者可以利用React的靈活性和Bootstrap的樣式庫(kù),創(chuàng)建美觀且高效的用戶(hù)界面。

React的SEO友好性:提高搜索引擎可見(jiàn)性 React的SEO友好性:提高搜索引擎可見(jiàn)性 Apr 26, 2025 am 12:27 AM

是的,ReactApplicationsCanbEseo-FrylylywithProperStratecies.1)用戶(hù) - 插圖(SSR)withToolslikenext.jstogenate.jstogenate fullhtmlforindexing.2)enasleStaticsiteSitegeneration(ssg)

See all articles