最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

提高React界面性能的十個技巧

 更新時間:2021年05月13日 17:21:55   作者:51CTO  
眾所周知,性能是Web應(yīng)用界面的關(guān)鍵方面,它直接影響到用戶的使用體驗。本文將向您展示十種提高React UI性能的特定技術(shù)和一般方法。

總的說來,React是通過維護(hù)視圖中的內(nèi)存(in-memory)模型來運作的。這通常被稱為虛擬DOM,它可以被用來確定實際DOM何時需要被更新。不過,由于操控實際DOM的成本較高,因此我們需要確保僅在必要時才去更新DOM,進(jìn)而提高整體性能。

為了從React框架中獲取最高性能,并提升React界面的響應(yīng)效率,本文將從各種功能函數(shù)(如Suspense)、以及基于類的組件出發(fā),和您討論十項常用的、面向DOM的技術(shù)與方法。

shouldComponentUpdate

在編寫基于類的組件時,您可以重寫shouldComponentUpdate()的生命周期方法。該方法的目的在于:明確地聲明目標(biāo)組件是否需要被重新渲染(re-rendering)。值得注意的是,在更新實際DOM的生命周期中,渲染的開銷是非常巨大的。因此,只有在組件的屬性(props)或狀態(tài)(states)發(fā)生變化時,我們才需要讓React執(zhí)行渲染。有時您甚至可以跳過渲染,以避免整體調(diào)用所產(chǎn)生的開銷。

shouldComponentUpdate的簽名和操作比較簡單。在如下簡單示例中,組件需要知曉應(yīng)該在何種指定觸發(fā)條件下,去執(zhí)行更新。該方法將接收到的屬性與狀態(tài)當(dāng)作參數(shù),如果返回為true,組件將執(zhí)行渲染,否則并不觸發(fā)渲染。

shouldComponentUpdate(nextProps, nextState) { 
    if (this.props.significant !== nextProps.significant) { 
      return true; 
    } 
    return false; 
  } 

雖然上述代碼段主要檢查的是屬性,但是它對于狀態(tài)也同樣適用。當(dāng)然,在實際應(yīng)用中,對于屬性或狀態(tài)的檢查,并判定是否返回true,可能會更加復(fù)雜。如果您需要比較某個簡單的淺層值(shallow value),那么請使用下一個技巧--PureComponent。

PureComponent

如果您的組件僅需要對屬性和狀態(tài)進(jìn)行簡單的淺層比較(shallow comparison,https://stackoverflow.com/a/5703797/467240),以確定是否需要渲染,那么完全可以使用PureComponent之類的擴(kuò)展基類--class MyComponent extends React.PureComponent。它可以實現(xiàn):當(dāng)通過淺層比較,并未發(fā)現(xiàn)屬性或狀態(tài)發(fā)生了任何變化時,render()就不會被調(diào)用。顧名思義,PureComponent表示:僅在屬性或狀態(tài)改變時,才會觸發(fā)輸出的更改,因此該組件是純凈的,不會帶有任何副作用。

useEffect

前面的技巧僅適用于那些基于類的組件。為了達(dá)到與常規(guī)功能性組件相似的效果,您可以使用useEffect hook和memo之類的功能性組件。其中,useEffect與shouldComponentUpdate有著相似的效果,它允許用戶指定:僅在某些變量發(fā)生更改的情況下,生效某種特定的功能,從而避免了整體變更的開銷。下面是一個簡單的useEffect示例:

const MyComponent = (props) => { 
  useEffect(() => { 
    console.info("Update Complete: " + props.significantVariable); 
  }, [props.significantVariable]); 
} 

由上述代碼段可知,如果props.significantVariable已被更改(即變量發(fā)生了變化),那么該代碼就會運行生效。

用React.memo提供記憶

作為一個高階組件,memo包裝了各種組件,并擴(kuò)展了它們的行為能力。也就是說,如果功能性組件具有相同的屬性,memo便能夠以緩沖的方式,“記住”它們的結(jié)果。據(jù)此,它可以有效地防止功能性組件在無視屬性是否一致的情況下,去盲目地執(zhí)行渲染。

為了模仿PureComponent只關(guān)注屬性的行為,我們可以使用如下代碼段來包裝某些功能性組件,使其只檢查屬性的更改,而非狀態(tài)。由于屬性和狀態(tài)是不同的,因此通過比較,一旦props.quote被認(rèn)定為未發(fā)生改變,則其對應(yīng)的組件也不會重新渲染。

const MyComponent = (props) => { 
  return <span>props.quote</span> 
} 
export default React.memo(SomeComponent) 

同時,React.memo 可以通過第二個參數(shù),來檢查函數(shù)的等效性:

export default React.memo(MyComponent, (oldProps, newProps) => {} ); 

通過上述代碼,我們可以實現(xiàn)對用例新的和舊的屬性進(jìn)行比較。如果屬性相等,該函數(shù)則返回true。值得注意的是,這與我們在前面介紹的shouldComponentUpdate,在發(fā)現(xiàn)組件出現(xiàn)更新時返回true,正好相反。

窗口化(列表虛擬化)

現(xiàn)在,讓我們將注意力轉(zhuǎn)移到一項同時適用于功能性和類組件的技術(shù)--窗口化(windowing)上。例如有一個具有數(shù)千行記錄的數(shù)據(jù)表或列表,如果您想在該表所對應(yīng)的應(yīng)用界面上顯示大量數(shù)據(jù)集,那么就需要采用“窗口化”的方式來查詢數(shù)據(jù)。也就是說,我們可以通過一次性僅加載和顯示部分?jǐn)?shù)據(jù)的形式,防止大量數(shù)據(jù)“卡死”應(yīng)用的用戶界面(UI)。為此,我們時常可以用到react-window庫(請參見--https://github.com/bvaughn/react-window)。

函數(shù)緩存

如果您覺得函數(shù)調(diào)用的成本過高,那么可以考慮對其進(jìn)行緩存。如果各個參數(shù)相同,而且緩存能夠返回結(jié)果,我們就可以使用存儲式緩存(memorized cache)的方式,來避免各種針對數(shù)據(jù)獲取的調(diào)用。當(dāng)然,函數(shù)緩存是否真的適用,還取決于函數(shù)的具體特征。

延遲加載和代碼拆分

所謂延遲加載是指:我們僅在必要時,才去加載數(shù)據(jù)。React 16.6引入了React.lazy(),它允許用戶對代碼按需進(jìn)行拆分。這意味著,您可以在使用常規(guī)組件語法的同時,獲得各種延遲加載的語義。

當(dāng)然,React 16.6之前的版本,并非無法實現(xiàn)代碼拆分,只是在處置大型代碼庫時,相對比較繁瑣。

并發(fā)模式、Suspense和useDeferredValue

作為React 16的一項最顯著的新功能,并發(fā)模式可以讓用戶通過使用Suspense組件,實現(xiàn)數(shù)據(jù)獲取和渲染的并行處理,進(jìn)而極大地提高應(yīng)用程序的實際感知性能。

我們除了能夠用Suspense組件來定義數(shù)據(jù)的獲取區(qū)域之外,還可以使用諸如useDeferredValue等由React 16帶來的新組件,來提升自動建議(auto-suggest)等工作方式,進(jìn)而避免用戶碰到諸如錯誤性的鍵入等不良的體驗。

數(shù)據(jù)獲取的防抖(Debounce)和限流(throttle)

大多數(shù)情況下,我們可以通過debounce或throttle函數(shù),來更好地處理React的并發(fā)模式。如果您的代碼庫被鎖定為舊版的渲染引擎,而無法開啟并發(fā)模式時,此類函數(shù)便可以有效地避免在數(shù)據(jù)獲取的過程中,出現(xiàn)混亂的局面。

例如,如果您想在用戶鍵入數(shù)據(jù)的同時,實時地獲取他們的輸入,那么由于每個擊鍵都會觸發(fā)一個請求,因此整體的性能會大打折扣。對此,我們便可以使用debounce或throttle函數(shù),來緩解此類問題。

分析(Profiling)

除了上面提到的技術(shù),我們還可以通過對應(yīng)用程序進(jìn)行性能分析,來獲悉性能瓶頸的所在,并驗證上述改進(jìn)方法的實際效果。目前,像Chrome和Firefox之類的瀏覽器,都帶有內(nèi)置的分析器(profiler)。一旦啟用了React的開發(fā)模式(dev mode),您將可以通過分析器,來查看某些正在使用的特定組件。這對于檢查網(wǎng)絡(luò)的狀態(tài),以及識別后端調(diào)用的延遲,都是非常實用的。據(jù)此,您可以清晰地判斷出,到底是前端JavaScript的代碼問題,還是存在著需要后端修復(fù)的缺陷。

此外,React 16.5以及更高的版本,還提供了一個名為DevTools Profiler(https://reactjs.org/blog/2018/09/10/introducing-the-react-profiler.html)的工具。它既能夠為處于并發(fā)模式的各個函數(shù),提供了更加詳盡的服務(wù)功能與集成;又可以通過多種方法,對應(yīng)用程序的行為活動進(jìn)行切片(slice)和切塊(dice)。

另一類Profiler組件則能夠展現(xiàn)組件渲染生命周期中的各種詳細(xì)信息。

React的生產(chǎn)環(huán)境構(gòu)建

最后,在部署生產(chǎn)環(huán)境時,您還需要確保生產(chǎn)環(huán)境構(gòu)建(production build)的精簡性、且不包含任何開發(fā)調(diào)試過程中的日志記錄。當(dāng)然,具體步驟取決于您所使用的構(gòu)建工具。

以上就是提高React界面性能的十個技巧的詳細(xì)內(nèi)容,更多關(guān)于提高React界面性能的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • React常見的?HOC?使用案例及示例代碼

    React常見的?HOC?使用案例及示例代碼

    高階組件(Higher-Order?Component,HOC)是一種用于在?React?中復(fù)用組件邏輯的技術(shù),這篇文章主要介紹了React常見的?HOC?使用案例示例代碼,需要的朋友可以參考下
    2024-08-08
  • 在React中使用React.createRef:更優(yōu)雅的DOM引用方式

    在React中使用React.createRef:更優(yōu)雅的DOM引用方式

    React提供了多種方式來引用DOM元素,其中React.createRef()是一種更為現(xiàn)代、更優(yōu)雅的方式,在這篇文章中,我們將深入了解React.createRef()的應(yīng)用,以及它為開發(fā)者帶來的便利,感興趣的朋友一起看看吧
    2024-01-01
  • 詳解create-react-app 自定義 eslint 配置

    詳解create-react-app 自定義 eslint 配置

    這篇文章主要介紹了詳解create-react-app 自定義 eslint 配置,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • 詳解React native全局變量的使用(跨組件的通信)

    詳解React native全局變量的使用(跨組件的通信)

    本篇文章主要介紹了詳解React native全局變量的使用(跨組件的通信),具有一定的參考價值,有興趣的同學(xué)可以了解一下
    2017-09-09
  • 基于React.js實現(xiàn)簡單的文字跑馬燈效果

    基于React.js實現(xiàn)簡單的文字跑馬燈效果

    剛好手上有一個要實現(xiàn)文字跑馬燈的react項目,然后ant-design上面沒有這個組件,于是只能自己手?jǐn)]一個,文中的實現(xiàn)方法講解詳細(xì),希望對大家有所幫助
    2023-01-01
  • ReactNative實現(xiàn)圖片上傳功能的示例代碼

    ReactNative實現(xiàn)圖片上傳功能的示例代碼

    本篇文章主要介紹了ReactNative實現(xiàn)圖片上傳功能的示例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-07-07
  • 詳解React Angular Vue三大前端技術(shù)

    詳解React Angular Vue三大前端技術(shù)

    當(dāng)前世界中,技術(shù)發(fā)展非常迅速并且變化迅速,開發(fā)者需要更多的開發(fā)工具來解決不同的問題。本文就對于當(dāng)下主流的前端開發(fā)技術(shù)React、Vue、Angular這三個框架做個相對詳盡的探究,目的是為了解開這些前端技術(shù)的面紗,看看各自的廬山真面目。
    2021-05-05
  • react底層的四大核心內(nèi)容架構(gòu)詳解

    react底層的四大核心內(nèi)容架構(gòu)詳解

    這篇文章主要為大家詳細(xì)介紹了react四大核心內(nèi)容架構(gòu),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • React如何接收excel文件下載導(dǎo)出功能封裝

    React如何接收excel文件下載導(dǎo)出功能封裝

    這篇文章主要介紹了React如何接收excel文件下載導(dǎo)出功能封裝,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • 在React中強(qiáng)制重新渲染的4 種方式案例代碼

    在React中強(qiáng)制重新渲染的4 種方式案例代碼

    這篇文章主要介紹了在React中強(qiáng)制重新渲染的4 種方式,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-12-12

最新評論

海原县| 清水河县| 凤翔县| 平定县| 禄劝| 万山特区| 康平县| 宜章县| 化隆| 龙江县| 离岛区| 连城县| 阜新| 饶河县| 德阳市| 日喀则市| 克拉玛依市| 万宁市| 奉节县| 布拖县| 巴塘县| 阳朔县| 海丰县| 巨野县| 得荣县| 阳新县| 马山县| 同江市| 云南省| 石台县| 且末县| 广西| 巫溪县| 忻城县| 满城县| 郁南县| 锦州市| 灵宝市| 河北区| 井冈山市| 东乌珠穆沁旗|