摘要:為什么會(huì)慢呢因?yàn)閷?duì)的修改為影響網(wǎng)頁(yè)的用戶(hù)界面,重繪頁(yè)面是一項(xiàng)昂貴的操作。太多的操作會(huì)導(dǎo)致一系列的重繪操作,為了確保執(zhí)行結(jié)果的準(zhǔn)確性,所有的修改操作是按順序同步執(zhí)行的?;亓鞑僮髦饕獣?huì)發(fā)生在幾種情況下當(dāng)對(duì)節(jié)點(diǎn)執(zhí)行新增或者刪除操作時(shí)。
一. 函數(shù)式編程
React 把用戶(hù)界面抽象成一個(gè)個(gè)組件,如按鈕組件 Button、對(duì)話框組件 Dialog、日期組件 Calendar。 開(kāi)發(fā)者通過(guò)組合這些組件,最終得到功能豐富、可交互的頁(yè)面。通過(guò)引入 JSX 語(yǔ)法,復(fù)用組件變得非常容易, 同時(shí)也能保證組件結(jié)構(gòu)清晰。有了組件這層抽象,React 把代碼和真實(shí)渲染目標(biāo)隔離開(kāi)來(lái),除了可以在瀏覽器 端渲染到 DOM 來(lái)開(kāi)發(fā)網(wǎng)頁(yè)外,還能用于開(kāi)發(fā)原生移動(dòng)應(yīng)用。
二 虛擬DOM
DOM操作的效率是很低的,而且不是一般的慢,而且這也是引發(fā)性能問(wèn)題的常見(jiàn)問(wèn)題之一。為什么會(huì)慢呢? 因?yàn)閷?duì) DOM的修改為影響網(wǎng)頁(yè)的用戶(hù)界面,重繪頁(yè)面是一項(xiàng)昂貴的操作。太多的DOM操作會(huì)導(dǎo)致一系列的重 繪操作,為了確保執(zhí)行結(jié)果的準(zhǔn)確性,所有的修改操作是按順序同步執(zhí)行的。我們稱(chēng)這個(gè)過(guò)程叫做回流 (reflow),同時(shí)這也是最昂貴的瀏覽器操作之一?;亓鞑僮髦饕獣?huì)發(fā)生在幾種情況下:
當(dāng)對(duì)DOM節(jié)點(diǎn)執(zhí)行新增或者刪除操作時(shí)。
動(dòng)態(tài)設(shè)置一個(gè)樣式時(shí)(比如element.style.width="10px")。
當(dāng)獲取一個(gè)必須經(jīng)過(guò)計(jì)算的尺寸值時(shí),比如訪問(wèn)offsetWidth、clientHeight或者其他需要經(jīng)過(guò)計(jì)算的CSS值(在兼容DOM的瀏覽器中,可以通過(guò)getComputedStyle函數(shù)獲?。辉贗E中,可以通過(guò)currentStyle屬性獲?。?。 解決問(wèn)題的關(guān)鍵,就是限制通過(guò)DOM操作所引發(fā)回流的次數(shù)。大部分瀏覽器都不會(huì)在JavaScript的執(zhí)行過(guò)程中更新DOM。相應(yīng)的,這些瀏覽器將對(duì)對(duì)DOM的操作放進(jìn)一個(gè)隊(duì)列,并在JavaScript腳本執(zhí)行完畢以后按順序一次執(zhí)行完畢。也就是說(shuō),在JavaScript執(zhí)行的過(guò)程中,用戶(hù)不能和瀏覽器進(jìn)行互動(dòng),直到一個(gè)回流操作被執(zhí)行。(失控腳本對(duì)話框會(huì)觸發(fā)回流操作,因?yàn)樗麍?zhí)行了一個(gè)中止JavaScript執(zhí)行的操作,此時(shí)會(huì)對(duì)用戶(hù)界面進(jìn)行更新)
真實(shí)頁(yè)面對(duì)應(yīng)一個(gè) DOM 樹(shù)。在傳統(tǒng)頁(yè)面的開(kāi)發(fā)模式中,每次需要更新頁(yè)面時(shí),都要手動(dòng)操作DOM進(jìn)行更新。DOM 操作非常昂貴。我們都知道在前端開(kāi)發(fā)中,性能消耗最大的就是 DOM 操作,而且這部分代碼會(huì)讓整體項(xiàng)目的代碼變得難以維護(hù)。React 把真實(shí) DOM 樹(shù)轉(zhuǎn)換成 JavaScript 對(duì)象樹(shù),每次數(shù)據(jù)更新后,重新計(jì)算 Virtual DOM,并和上一次生成的 Virtual DOM 做對(duì)比,對(duì)發(fā)生變化的部分做批量更新。React 也提供了直觀的 houldComponentUpdate 生命周期回調(diào),來(lái)減少數(shù)據(jù)變化后不必要的 Virtual DOM 對(duì)比過(guò)程,以保證性能。我們說(shuō) Virtual DOM 提升了 React 的性能,但這并不是 React 的唯一亮點(diǎn)。此外,Virtual DOM的渲染方式也比傳統(tǒng) DOM 操作好一些,但并不明顯,因?yàn)閷?duì)比 DOM 節(jié)點(diǎn)也是需要計(jì)算資源的。它最大的好處其實(shí)還在于方便和其他平臺(tái)集成,比如 react-native 是基于 Virtual DOM 渲染出原生控件,因?yàn)?React 組件可以映射為對(duì)應(yīng)的原生控件。在輸出的時(shí)候,是輸出 Web DOM,還是 Android 控件,還是 iOS 控件,就由平臺(tái)本身決定了。因此,react-native 有一個(gè)口號(hào)——LearnOnce,Write Anywhere。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/95560.html
摘要:希望大家在這浮夸的前端圈里,保持冷靜,堅(jiān)持每天花分鐘來(lái)學(xué)習(xí)與思考。 今天的React題沒(méi)有太多的故事…… 半個(gè)月前出了248個(gè)Vue的知識(shí)點(diǎn),受到很多朋友的關(guān)注,都強(qiáng)烈要求再出多些React相前的面試題,受到大家的邀請(qǐng),我又找了20多個(gè)React的使用者,他們給出了328道React的面試題,由我整理好發(fā)給大家,同時(shí)發(fā)布在了前端面試每日3+1的React專(zhuān)題,希望對(duì)大家有所幫助,同時(shí)大...
摘要:本文翻譯自原作者如果有任何版權(quán)問(wèn)題,請(qǐng)聯(lián)系當(dāng)你在組件中調(diào)用時(shí),你覺(jué)得會(huì)發(fā)生什么當(dāng)然,會(huì)用這條狀態(tài)重新渲染組件并且更新匹配到的,然后返回元素。如果你之前使用過(guò)一些渲染器比如說(shuō),你可能知道在頁(yè)面中使用超過(guò)一個(gè)渲染器是沒(méi)什么問(wèn)題的。 本文翻譯自:How Does setState Know What to Do?原作者:Dan Abramov 如果有任何版權(quán)問(wèn)題,請(qǐng)聯(lián)系shuirong199...
摘要:為了使用它們,您可以向組件添加一個(gè)屬性,該屬性的值是一個(gè)回調(diào)函數(shù),它將接收底層的元素或組件的已掛接實(shí)例,作為其第一個(gè)參數(shù)。通常最好使用另一個(gè)生命周期方法,而不是依賴(lài)這個(gè)回調(diào)函數(shù),但是很高興知道它存在。 React 常見(jiàn)的面試題 (在 React 里面,你可以知道也可以不知道的事, 但是你會(huì)發(fā)現(xiàn)他們確實(shí)很有用) 根據(jù)記錄,問(wèn)這些問(wèn)題可能不是深入了解他們?cè)谑褂?React 方面的經(jīng)驗(yàn)的最...
摘要:因?yàn)榘姹緦⒄嬲龔U棄這三生命周期到目前為止,的渲染機(jī)制遵循同步渲染首次渲染,更新時(shí)更新時(shí)卸載時(shí)期間每個(gè)周期函數(shù)各司其職,輸入輸出都是可預(yù)測(cè),一路下來(lái)很順暢。通過(guò)進(jìn)一步觀察可以發(fā)現(xiàn),預(yù)廢棄的三個(gè)生命周期函數(shù)都發(fā)生在虛擬的構(gòu)建期間,也就是之前。 showImg(https://segmentfault.com/img/bVbweoj?w=559&h=300); 背景 前段時(shí)間準(zhǔn)備前端招聘事項(xiàng)...
摘要:內(nèi)部機(jī)制探秘和文末附彩蛋和源碼這篇文章比較偏基礎(chǔ),但是對(duì)入門(mén)內(nèi)部機(jī)制和實(shí)現(xiàn)原理卻至關(guān)重要。當(dāng)然也需要明白一些淺顯的內(nèi)部工作機(jī)制。當(dāng)改變出現(xiàn)時(shí),相比于真實(shí)更新虛擬的性能優(yōu)勢(shì)非常明顯。直到最終,會(huì)得到完整的表述樹(shù)的對(duì)象。 React 內(nèi)部機(jī)制探秘 - React Component 和 Element(文末附彩蛋demo和源碼) 這篇文章比較偏基礎(chǔ),但是對(duì)入門(mén) React 內(nèi)部機(jī)制和實(shí)現(xiàn)原...
摘要:來(lái)自于中文編碼規(guī)范編碼規(guī)范算是最合理的編碼規(guī)范之一了基本規(guī)范每個(gè)文件只寫(xiě)一個(gè)模塊但是多個(gè)無(wú)狀態(tài)模塊可以放在單個(gè)文件中推薦使用語(yǔ)法不要使用,除非從一個(gè)非的文件中初始化你的創(chuàng)建模塊如果你的模塊有內(nèi)部狀態(tài)或者是推薦使用而不是除非你有充足的理由 來(lái)自于Airbnb React/JSX 中文編碼規(guī)范 Airbnb React/JSX 編碼規(guī)范 算是最合理的React/JSX編碼規(guī)范之一了 Bas...
閱讀 2590·2021-10-19 11:41
閱讀 2425·2021-09-01 10:32
閱讀 3386·2019-08-29 15:21
閱讀 1765·2019-08-29 12:20
閱讀 1173·2019-08-29 12:13
閱讀 609·2019-08-26 12:24
閱讀 2527·2019-08-26 10:26
閱讀 843·2019-08-23 18:40