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