當(dāng)前位置:首頁 > IT技術(shù) > 編程語言 > 正文

用React寫函數(shù)組件,如何避免重復(fù)渲染?
2022-05-11 10:53:54

用React寫函數(shù)組件,如何避免重復(fù)渲染?

?

場景:

有一個自定義的item組件, 它的onClick方法是父組件透傳的。父組件中含有大量的item。

當(dāng)父組件更新時(shí),onClick會被重新創(chuàng)建,由于函數(shù)跟常量不一樣,是一個引用,因此即使item用了React.memo包裹,也會認(rèn)為props中傳過來的onClick是新創(chuàng)建的,導(dǎo)致所有item都會重新渲染。

如果用useCallback來包裹onClick,確實(shí)可以避免不相關(guān)的item渲染,但是如果item是作為一個對外提供的組件,并不能保證開發(fā)者有使用useCallback的意識

問:這種情況我該如何優(yōu)化我的組件設(shè)計(jì)呢

?

這是react埋的坑,它埋的坑多的數(shù)不勝數(shù),有的時(shí)候真覺得垃圾。

React組件重建vdom取決于兩個因素 props和state。你這種情況是說,props接收不受你控制,其他人也不管性能問題,胡寫瞎寫。說來說去,都是react官方埋的坑。

針對你上述具體問題,你可以在你的組件外面套一個React.memo,它有第二個參數(shù),用來決定你傳入的props是否變化,具體用法看官方文檔。判斷的時(shí)候,你直接忽略onClick,因?yàn)榇蟛糠謭鼍跋禄卣{(diào)函數(shù)都不會發(fā)生變化,誰會設(shè)計(jì)根據(jù)一個回調(diào)函數(shù)來重新渲染界面呢?除非要把函數(shù)的字符串顯示在界面上……這種場景沒見過。

基于這個想法,我們還可以基于React.memo封裝一個高階函數(shù),所有函數(shù)組件都用這個高階函數(shù)包裝。再定個規(guī)矩,所有以on開頭的回調(diào)函數(shù)傳給組件,只接收一次,后續(xù)你換個函數(shù)給我我都不理會,也不會重新觸發(fā)渲染。在高階函數(shù)里面實(shí)現(xiàn)這個邏輯。



作者:否子戈
鏈接:https://www.zhihu.com/question/442368205/answer/1711027669
來源:知乎
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。

本文摘自 :https://www.cnblogs.com/

開通會員,享受整站包年服務(wù)立即開通 >