国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

提高 React 性能的技巧

這篇具有很好參考價(jià)值的文章主要介紹了提高 React 性能的技巧。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1.解決重復(fù)渲染問題

我們大多數(shù)人都知道虛擬 DOM 是如何工作的,但最重要的是檢測何時(shí)觸發(fā)樹比較。當(dāng)我們可以跟蹤它時(shí),我們可以控制組件的重新渲染,并最終防止意外的性能流。令人驚訝的是,它并不難捕捉。首先,將 React Devtool 擴(kuò)展添加到瀏覽器。

  • 然后打開瀏覽器開發(fā)者工具(在 Chrome 中是 Option + ? + J(在 macOS 上),或 Shift + CTRL + J(在 Windows/Linux 上)。

  • 選擇組件

  • 點(diǎn)擊設(shè)置圖標(biāo)

  • 并選中“組件渲染時(shí)突出顯示更新”

提高 React 性能的技巧

就是這樣,現(xiàn)在,當(dāng)我們與 UI 交互時(shí),它會在當(dāng)前重新渲染的元素上顯示綠色邊框。知道了這一點(diǎn),我們就可以分析我們的任何 React 組件并重構(gòu)它們以避免不必要的重新渲染。

2.通過拆分組件減少重新渲染

如果我們能夠減少意外重新渲染元素的數(shù)量,它將解決 React 中的大部分性能問題。

但我們必須首先回答這個(gè)問題:“是什么觸發(fā)了重新渲染?”。答案很簡單,狀態(tài)改變了。

每次組件狀態(tài)發(fā)生變化時(shí),它都會喚醒樹比較,也稱為協(xié)調(diào),并重新呈現(xiàn)狀態(tài)上下文的元素。

狀態(tài)上下文,是初始化此類狀態(tài)的組件。意思是,如果我們有一個(gè)巨大的組件,它有很多狀態(tài)(不需要相互依賴)并且其中一個(gè)狀態(tài)發(fā)生了變化,它將重新渲染整個(gè)組件元素,這絕對不是我們想要的。

那么,解決方案是什么?解決方法是通過將組件的一部分和它的一些狀態(tài)移動到它自己的子組件中來分離狀態(tài)上下文,現(xiàn)在,讓我們看一下這個(gè)例子:

假設(shè)我們有一個(gè)帶有搜索過濾器的表格組件。搜索過濾器是一個(gè)受控輸入,其狀態(tài)在輸入文本更改后更新。這是它的樣子:

提高 React 性能的技巧

當(dāng)我們開始在搜索輸入字段中輸入時(shí)會發(fā)生什么?

提高 React 性能的技巧

是的,它將重新呈現(xiàn)整個(gè)表格元素。發(fā)生這種情況是因?yàn)檩斎霠顟B(tài)上下文與表組件共享相同的上下文。

現(xiàn)在,讓我們嘗試我們的解決方案,將輸入元素及其狀態(tài)移動到一個(gè)單獨(dú)的組件中,并將其注入到表格組件中。

提高 React 性能的技巧

提高 React 性能的技巧

神奇的事情發(fā)生了,表格組件不再重新渲染。我們稍后可以通過從輸入發(fā)出事件來控制我們希望輸入影響表格元素的確切時(shí)間來增強(qiáng)功能。

好的做法是拆分組件以分離狀態(tài)上下文,以避免冗余的重新渲染。

3.什么是實(shí)例重創(chuàng)建,如何避免?

我們已經(jīng)發(fā)現(xiàn)狀態(tài)更改會觸發(fā)組件重新渲染,但是我們需要考慮另一個(gè)重要的副作用。

當(dāng)狀態(tài)改變和協(xié)調(diào)發(fā)生時(shí),它將重新初始化整個(gè)組件實(shí)例并保持新的狀態(tài)值。這對我們來說意味著,在協(xié)調(diào)期間,將重新創(chuàng)建所有函數(shù)實(shí)例,以便能夠考慮新的狀態(tài)值,我們不需要它,在大多數(shù)情況下,函數(shù)可以只依賴于幾個(gè)狀態(tài),我們不想重新創(chuàng)建不依賴于已更改狀態(tài)的函數(shù)實(shí)例。

這是一個(gè)提高性能的機(jī)會,我們有幾個(gè)解決方案:useCallback 和 useRef。讓我們看個(gè)例子:

const?{someState,?setSomeState}?=?useState('')
const?{otherState,?setOtherState}?=?useState('')
const?foo?=?()?=>?{console.log(someState)}

這是最常見的例子。我們有依賴于狀態(tài) someState 的 foo。當(dāng) someState 改變時(shí),它將重新創(chuàng)建 foo 的新實(shí)例。

這段代碼的問題是,即使其他一些狀態(tài)發(fā)生變化,比如 otherState,foo 也會被重新創(chuàng)建,這是我們實(shí)際上不想要的。我們可以使用 useCallback 來告訴 React 我們的函數(shù)狀態(tài)依賴是什么,以便更明確地說明何時(shí)重新創(chuàng)建實(shí)例:

const?{someState,?setSomeState}?=?useState('')
const?{otherState,?setOtherState}?=?useState('')
const?foo?=?useCallback(()?=>?{console.log(someState)},?[someState])

在此示例中,我們將依賴項(xiàng)數(shù)組傳遞給 useCallback 掛鉤。更好的是,foo 將避免其他狀態(tài)更改。

另一種選擇是使用 useRef。useRef——你可以把它想象成和 useState 一樣,但不會觸發(fā)組件重新渲染(UI 不會更新)。useRef 沒有依賴列表,所以我們需要傳遞 someState as foo 屬性:

const?{someState,?setSomeState}?=?useState('')
const?{otherState,?setOtherState}?=?useState('')
const?foo?=?useRef((currentSomeState)?=>?{console.log(currentSomeState)}).current;

在這種情況下,我們根本不會重新創(chuàng)建 foo 實(shí)例。

結(jié)論:使用 useCallback 和 useRef 來控制函數(shù)實(shí)例的重新創(chuàng)建。

4.不要偷懶懶加載

React 默認(rèn)同步渲染組件。這意味著組件將等到其子項(xiàng)被渲染后再渲染自己。沒有必要等待,尤其是當(dāng)一些子組件沒有耦合時(shí)。它可能會導(dǎo)致頁面掛起。

假設(shè)我們點(diǎn)擊了一些導(dǎo)航鏈接,假設(shè)將我們重定向到另一個(gè)頁面。導(dǎo)航將等待所有頁面組件呈現(xiàn)完成重定向。它會影響用戶體驗(yàn),人們不會等待,只會離開您的網(wǎng)站。

我們需要使頁面內(nèi)容異步呈現(xiàn),以免損害導(dǎo)航。解決方案是將您的頁面組件包裝到 React.lazy(() 并告訴 React 完成導(dǎo)航,然后等待頁面組件完成渲染:

const?PageComponent?=?React.lazy(()?=>?import('./PageComponent'));

稍后我們可以使用在頁面組件尚未準(zhǔn)備好時(shí),顯示一些加載動畫。

<Suspense?fallback={<div>Loading...</div>}>
???<PageComponent?/>
</Suspense>

這并不意味著我們必須在任何地方都使用 Lazy load 組件,當(dāng)我們在不會對性能造成太大損害的地方使用它時(shí),它可能會導(dǎo)致過度工程。

另一種場景是一些組件可能默認(rèn)隱藏在 UI 中,所以我們不必等待它們。例如模態(tài)窗口、對話框、抽屜和可折疊的側(cè)面板。

延遲加載頁面組件和隱藏的 UI 組件。

5.何時(shí)使用 React 片段?

它經(jīng)常發(fā)生,當(dāng)我們在 JSX 中構(gòu)建一些布局并想要對我們的元素進(jìn)行分組時(shí),在大多數(shù)情況下我們使用

標(biāo)簽。或者,例如,我們有我們想要移動到單獨(dú)組件中的父子 HTML 標(biāo)記:

<ul>
????<li>Item?1</li>?<---?|?Want?to?move?it?to?child?<Li>?|
????<li>Item?2</li>?<---?|???????????????????????????????|
</ul>

因此,當(dāng)我們將?<li>?移動到單獨(dú)的組件中時(shí),例如:

const?Li?=?()?=>?{
????return?(
????????<div>
????????????<li>Item?1</li>
????????????<li>Item?2</li>
????????</div>
????)
}

并改變它:

<ul>
????<Li/>
</ul>

渲染后,它看起來像這樣:

<ul>
????<div>
????????<li>Item?1</li>??
????????<li>Item?2</li>????
????</div>
</ul>

這將創(chuàng)建一個(gè)我們不需要的額外<div>節(jié)點(diǎn)。

這將使我們的 DOM 樹更加嵌套,從而減慢協(xié)調(diào)過程。

相反, 我們可以將我們的<div>子元素包裝到 Fragment 中。

最初,F(xiàn)ragment 允許您對 DOM 元素進(jìn)行分組,插入后只會導(dǎo)致一次重排。

在 React 中,F(xiàn)ragment 也會讓你減少不必要的節(jié)點(diǎn)。當(dāng)你想對元素進(jìn)行分組時(shí),你唯一需要做的就是使用 Fragment 而不是?<div>:

const?Li?=?()?=>?{
????return?(
????????<>?/*?or?<React.Fragment>,?or?<Fragment>*/
????????????<li>Item?1</li>
????????????<li>Item?2</li>
????????</>
????)
}

就是這樣,就這么簡單。

如果要對元素進(jìn)行分組以減少節(jié)點(diǎn)數(shù),請使用 Fragment。

6.避免在列出的元素中使用索引作為鍵

大家都知道,如果沒有,Eslint 會強(qiáng)制執(zhí)行在列出的元素中使用鍵,例如:

<ul>
????<li?key="1">Item?1</li>??
????<li?key="2">Item?2</li>????
</ul>

React 中的關(guān)鍵是唯一標(biāo)識符,它幫助 React 指向列表中的正確元素并更新正確的元素。如果我們使用索引作為列表中的鍵,比如:

<ul>
????{[1,?2].map((val,?index)?=>?<li?key={index}>Item?{val}</li>)}??
</ul>

我們將元素映射到它的索引。但是如果我們有排序,列表中元素的順序可能會改變,初始鍵將不再指向正確的元素。

始終使用唯一 id 作為列出元素的鍵,如果對象沒有它,您可以使用外部庫顯式分配,如 uid。

7.避免Spread Props

這是今天的最后一個(gè)修改調(diào)整技巧,已經(jīng)很多了, 你一定見過,甚至自己親手做過spreading props。就像是:

const?Input?=?({?onChange,?...props?})?=>?(
????<input?{...props}?onChange={e?=>?onChange(e.target.value)}/>
);

它不僅迫使您猜測實(shí)際輸入接收到的屬性是什么,而且還會在輸入元素中創(chuàng)建一堆您不一定需要的屬性。

讓它明確,并且不要害怕根據(jù)需要傳遞盡可能多的屬性,您總是可以將它們分組到某個(gè)對象中:

const?Input?=?({?onChange,?inputProps:?{value,?type,?className}?})?=>?(
????<input?className={className}?type={type}?value={value}?onChange={e?=>?onChange(e.target.value)}/>
);

很好,現(xiàn)在更具可讀性。

永遠(yuǎn)不要spread props,分別傳遞每個(gè)屬性。

總結(jié)

我想,您可能已經(jīng)知道 Eslint 強(qiáng)制執(zhí)行的一些調(diào)整,但是現(xiàn)在您知道為什么遵循它們很重要了,而且,您可以對代碼進(jìn)行性能分析,這將為您提供改進(jìn)空間。文章來源地址http://www.zghlxwxcb.cn/news/detail-487048.html

到了這里,關(guān)于提高 React 性能的技巧的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Spring Cache:提高應(yīng)用性能的策略和技巧

    Spring Cache:提高應(yīng)用性能的策略和技巧

    ???? 博主貓頭虎(????)帶您 Go to New World??? ?? 博客首頁 ——????貓頭虎的博客?? ?? 《面試題大全專欄》 ?? 文章圖文并茂??生動形象??簡單易學(xué)!歡迎大家來踩踩~?? ?? 《IDEA開發(fā)秘籍專欄》 ?? 學(xué)會IDEA常用操作,工作效率翻倍~?? ?? 《100天精通Golang(基礎(chǔ)

    2024年02月09日
    瀏覽(28)
  • 探討Redis緩存問題及解決方案:緩存穿透、緩存擊穿、緩存雪崩與緩存預(yù)熱(如何解決Redis緩存中的常見問題并提高應(yīng)用性能)

    探討Redis緩存問題及解決方案:緩存穿透、緩存擊穿、緩存雪崩與緩存預(yù)熱(如何解決Redis緩存中的常見問題并提高應(yīng)用性能)

    Redis是一種非常流行的開源緩存系統(tǒng),用于緩存數(shù)據(jù)以提高應(yīng)用程序性能。但是,如果我們不注意一些緩存問題,Redis也可能會導(dǎo)致一些性能問題。在本文中,我們將探討Redis中的一些常見緩存問題,并提供解決方案。 緩存穿透指的是當(dāng)一個(gè)請求嘗試訪問一個(gè)不存在于緩存中的

    2024年02月03日
    瀏覽(169)
  • CSS 提高性能的方法,并提供一些實(shí)用的技巧和代碼示例

    CSS 是前端開發(fā)中不可或缺的一部分,它負(fù)責(zé)網(wǎng)頁的樣式和布局。隨著網(wǎng)站規(guī)模和復(fù)雜度的增加,CSS 的性能也變得越來越重要。本文將介紹 CSS 提高性能的方法,并提供一些實(shí)用的技巧和代碼示例。 使用壓縮后的 CSS 文件 壓縮 CSS 文件可以減小文件大小,加快加載速度。常見的

    2024年02月06日
    瀏覽(35)
  • Spark性能優(yōu)化:提高計(jì)算速度與資源利用率的實(shí)用技巧

    Apache Spark是一個(gè)開源的大規(guī)模數(shù)據(jù)處理框架,它可以處理批量數(shù)據(jù)和流式數(shù)據(jù),并提供了一個(gè)易用的編程模型。Spark的核心組件是Spark引擎,它負(fù)責(zé)執(zhí)行用戶的計(jì)算任務(wù)。在大規(guī)模數(shù)據(jù)處理中,Spark性能優(yōu)化是非常重要的,因?yàn)樗梢蕴岣哂?jì)算速度和資源利用率。 在本文中,我

    2024年02月20日
    瀏覽(98)
  • 在Vue 3中,對于組件中的插槽(slots)生成進(jìn)行了優(yōu)化,以提高渲染性能和組件的更新速度。

    在Vue 3中,對于組件中的插槽(slots)生成進(jìn)行了優(yōu)化,以提高渲染性能和組件的更新速度。 在Vue 2中,每當(dāng)一個(gè)插槽被渲染時(shí),都會生成一個(gè)函數(shù)來創(chuàng)建對應(yīng)的VNode節(jié)點(diǎn)。這意味著即使插槽內(nèi)容保持不變,每次渲染時(shí)仍然會重新生成相同的VNode節(jié)點(diǎn)。 而在Vue 3中,通過使用新

    2024年02月12日
    瀏覽(20)
  • react組件多次渲染問題

    問題背景 在數(shù)據(jù)沒有發(fā)生變化的情況下React組件會進(jìn)行數(shù)次重復(fù)渲染,繪制出來完全相同的兩個(gè)圖 排查思路 尋找子組件重渲染原因?qū)嶒?yàn) 測試一:在子組件的props未發(fā)生任何變更的情況下是否會發(fā)生重新渲染 測試結(jié)論:子組件即使不接收任何props當(dāng)父組件重新渲染時(shí)子組件也

    2024年02月12日
    瀏覽(48)
  • 【React】- 組件生命周期連續(xù)渲染兩次問題

    【React】- 組件生命周期連續(xù)渲染兩次問題

    最近在整理生命周期相關(guān)的知識內(nèi)容,然后發(fā)現(xiàn)一個(gè)奇怪的現(xiàn)象,即組件的生命周期會運(yùn)行2次!經(jīng)過確認(rèn)不是代碼問題,于是開始找度娘,終于找到其原因-React中的嚴(yán)格模式,在這里記錄一下 一、問題重現(xiàn) 如圖所示,當(dāng)組件初始化渲染時(shí),每個(gè)周期都走了2次,按理說初始化

    2024年02月15日
    瀏覽(19)
  • keep-alive 是 Vue 的一個(gè)內(nèi)置組件,用于緩存其他組件的實(shí)例,以避免重復(fù)渲染和銷毀,它可以在需要頻繁切換的組件之間提供性能優(yōu)化

    keep-alive 是 Vue 的一個(gè)內(nèi)置組件,用于緩存其他組件的實(shí)例,以避免重復(fù)渲染和銷毀,它可以在需要頻繁切換的組件之間提供性能優(yōu)化

    目錄 keep-alive? 使用 keep-alive 的示例代碼: 手動清除組件緩存的示例代碼: keep-alive 組件有以下幾個(gè)優(yōu)點(diǎn): keep-alive 的原理: 使用 keep-alive 組件,你可以包裹需要緩存的組件,然后這些組件在切換時(shí)將會被緩存起來,而不是每次都重新創(chuàng)建。 使用 keep-alive 的示例代碼: 我們

    2024年02月08日
    瀏覽(24)
  • React--》React組件變化每次都會導(dǎo)致重新渲染,如何解決?

    React--》React組件變化每次都會導(dǎo)致重新渲染,如何解決?

    目錄 React.memo useCallback useMemo React組件會在兩種情況下下發(fā)生渲染 第一種 :當(dāng)組件自身的state發(fā)生變化時(shí) 第二種 :當(dāng)組件的父組件重新渲染時(shí) 第一種情況下重新渲染無可厚非,state都變化了組件自然應(yīng)該重新進(jìn)行渲染,但是第二種情況似乎并不是總怎么必要,有時(shí)候僅僅只需

    2023年04月21日
    瀏覽(20)
  • 解決前端性能瓶頸:高效處理大量數(shù)據(jù)渲染與復(fù)雜交互的策略與優(yōu)化方法

    解決前端性能瓶頸:高效處理大量數(shù)據(jù)渲染與復(fù)雜交互的策略與優(yōu)化方法

    ??祝屏幕前的小伙伴們每天都有好運(yùn)相伴左右,一定要天天開心!??? ????作者主頁: 喔的嘛呀???? 目錄 引言 一、分頁加載數(shù)據(jù) 二、虛擬滾動 三、懶加載 四、數(shù)據(jù)緩存 五、減少重繪和回流 六、優(yōu)化圖片和資源: 七、合并壓縮文件 八、使用Web Workers? 在前端開發(fā)

    2024年04月27日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包