国产av一二三区|日本不卡动作网站|黄色天天久久影片|99草成人免费在线视频|AV三级片成人电影在线|成年人aV不卡免费播放|日韩无码成人一级片视频|人人看人人玩开心色AV|人妻系列在线观看|亚洲av无码一区二区三区在线播放

網(wǎng)易首頁(yè) > 網(wǎng)易號(hào) > 正文 申請(qǐng)入駐

React把3個(gè)性能工具藏了8年,開發(fā)者還在互相抄錯(cuò)答案

0
分享至

React官方文檔里有3個(gè)API,Stack Overflow上關(guān)于它們的回答錯(cuò)誤率高達(dá)60%。你搜到的"最佳實(shí)踐"可能是2019年的過(guò)時(shí)方案,而React 18之后規(guī)則已經(jīng)變了。

這不是語(yǔ)法問(wèn)題,是認(rèn)知問(wèn)題。我見過(guò)一個(gè)團(tuán)隊(duì)給所有組件包上React.memo,結(jié)果首屏?xí)r間漲了300毫秒——優(yōu)化工具變成了性能毒藥。

為什么你的memo沒生效

React.memo的工作原理很簡(jiǎn)單:比較新舊props,沒變就不渲染。但JavaScript的對(duì)象和函數(shù)是按引用比較,不是按值。

每次父組件渲染,內(nèi)部定義的函數(shù)和對(duì)象都是新引用。就算你寫的代碼看起來(lái)一模一樣,memo也會(huì)判定"props變了",重新渲染。

看這個(gè)典型踩坑案例:

function Parent() { const [count, setCount] = useState(0); // 每次渲染都是新數(shù)組,memo白包 const items = [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }]; // 每次渲染都是新函數(shù),memo白包 const handleSelect = (id) => console.log(id); return ; }

ExpensiveList就算包了React.memo也沒用,因?yàn)閕tems和handleSelect的引用每次都在變。這就像給漏水的桶加了個(gè)蓋子——水照樣流。

useCallback不是免死金牌

useCallback的作用是緩存函數(shù)引用,但很多人用錯(cuò)了場(chǎng)景。

正確用法:子組件用React.memo包裹,且該函數(shù)作為props傳給子組件。兩個(gè)條件缺一不可。

錯(cuò)誤用法:函數(shù)只在父組件內(nèi)部使用,或者子組件根本沒memo。這時(shí)候useCallback純純?cè)黾娱_銷,React要多維護(hù)一份依賴數(shù)組的比對(duì)。

React團(tuán)隊(duì)工程師Dan Abramov說(shuō)過(guò):「useCallback的默認(rèn)答案應(yīng)該是不用,除非你明確測(cè)量到性能問(wèn)題?!?/p>

依賴數(shù)組寫錯(cuò)是另一個(gè)重災(zāi)區(qū)??諗?shù)組[]表示"永遠(yuǎn)不變",但如果函數(shù)內(nèi)部用到了state或props,就會(huì)拿到過(guò)期的閉包值。

看這個(gè)正確示例:

const handleSelect = useCallback((id) => { setSelectedId(id); // 用了setSelectedId,但它是穩(wěn)定的 console.log('Selected:', id); }, []); // 空數(shù)組安全,因?yàn)閟etSelectedId不會(huì)變

但如果函數(shù)里用了count變量,就必須把count寫進(jìn)依賴數(shù)組,否則count永遠(yuǎn)是初始值。

useMemo的隱藏成本

useMemo緩存的是計(jì)算結(jié)果,不是渲染。很多人誤以為它能跳過(guò)組件渲染,其實(shí)它只跳過(guò)計(jì)算過(guò)程。

適用場(chǎng)景:復(fù)雜數(shù)據(jù)轉(zhuǎn)換、圖表計(jì)算、排序過(guò)濾大數(shù)據(jù)集。如果你的"計(jì)算"只是簡(jiǎn)單的數(shù)組map,useMemo的比對(duì)成本可能比重新計(jì)算還高。

React 18的并發(fā)特性讓事情更復(fù)雜。在Strict Mode下,React會(huì)故意雙調(diào)用某些函數(shù)來(lái)檢測(cè)副作用。如果你的useMemo依賴項(xiàng)里有不穩(wěn)定引用,雙調(diào)用會(huì)讓緩存失效兩次。

一個(gè)冷知識(shí):React.memo和useMemo都用了Object.is做比較,不是===。NaN === NaN是false,但Object.is(NaN, NaN)是true。這通常不影響業(yè)務(wù)代碼,但解釋了一些奇怪的緩存命中行為。

2024年的決策樹

基于React 18和實(shí)際項(xiàng)目數(shù)據(jù),這是我的判斷標(biāo)準(zhǔn):

React.memo:組件渲染成本 > 比對(duì)成本,且props穩(wěn)定。列表項(xiàng)、圖表、復(fù)雜表單適合。簡(jiǎn)單按鈕、純文本標(biāo)簽不需要。

useCallback:配合React.memo使用,且子組件確實(shí)因函數(shù)引用變化而重渲染。事件處理器傳給memo子組件是典型場(chǎng)景。

useMemo:計(jì)算成本 > 緩存成本,且結(jié)果作為props傳給memo子組件。注意:如果子組件沒memo,useMemo只是延遲了計(jì)算,沒減少渲染。

React 19的編譯器(React Compiler)可能會(huì)改變這一切。它自動(dòng)做memoization,理論上你不需要手動(dòng)寫這三個(gè)API。但編譯器目前還在實(shí)驗(yàn)階段,且對(duì)遺留代碼的改造有門檻。

一個(gè)來(lái)自生產(chǎn)環(huán)境的反饋:某電商團(tuán)隊(duì)在商品詳情頁(yè)移除了80%的useMemo/useCallback,首屏?xí)r間反而快了15%。他們的新原則是——先寫清楚,再測(cè)慢不慢,最后才優(yōu)化。

你的項(xiàng)目里有多少"防御性優(yōu)化"從沒被profile驗(yàn)證過(guò)?

特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關(guān)推薦
熱點(diǎn)推薦
張雪峰二婚妻子顏值高,正面照片流出,遺產(chǎn)繼承恐陷紛爭(zhēng)

張雪峰二婚妻子顏值高,正面照片流出,遺產(chǎn)繼承恐陷紛爭(zhēng)

老貓觀點(diǎn)
2026-03-26 07:35:34
200億美元收益!NBA推進(jìn)兩大計(jì)劃 每隊(duì)老板至少分到6.5億美元

200億美元收益!NBA推進(jìn)兩大計(jì)劃 每隊(duì)老板至少分到6.5億美元

羅說(shuō)NBA
2026-03-26 06:21:27
卡塔爾向伊朗交60億美元保護(hù)費(fèi)? 伊朗打擊升級(jí): 瞄準(zhǔn)以色列往死里打

卡塔爾向伊朗交60億美元保護(hù)費(fèi)? 伊朗打擊升級(jí): 瞄準(zhǔn)以色列往死里打

起喜電影
2026-03-26 13:20:15
中年男人最大的悲哀是什么?網(wǎng)友:說(shuō)到底就是自己能力差唄

中年男人最大的悲哀是什么?網(wǎng)友:說(shuō)到底就是自己能力差唄

帶你感受人間冷暖
2026-03-23 00:02:19
陳明仁起義開價(jià):保留兵團(tuán)司令,林彪看完只說(shuō)了4個(gè)字

陳明仁起義開價(jià):保留兵團(tuán)司令,林彪看完只說(shuō)了4個(gè)字

史海孤雁
2026-03-24 17:26:17
50歲何潤(rùn)東做夢(mèng)也沒想到,因張凌赫一個(gè)造型,讓他的口碑一夜暴漲

50歲何潤(rùn)東做夢(mèng)也沒想到,因張凌赫一個(gè)造型,讓他的口碑一夜暴漲

八卦南風(fēng)
2026-03-24 15:15:25
“上海實(shí)體交通卡,為啥退不了?”73歲老伯來(lái)滬遭遇引發(fā)質(zhì)疑,記者調(diào)查:確實(shí)難

“上海實(shí)體交通卡,為啥退不了?”73歲老伯來(lái)滬遭遇引發(fā)質(zhì)疑,記者調(diào)查:確實(shí)難

新民晚報(bào)
2026-03-25 18:45:33
美軍第82空降師3000人出兵,危急時(shí)刻,伊朗特種兵亮劍56沖和FPV

美軍第82空降師3000人出兵,危急時(shí)刻,伊朗特種兵亮劍56沖和FPV

滄海旅行家
2026-03-26 13:11:41
估價(jià)32萬(wàn)!這4種年份的1元硬幣,可要留好了!

估價(jià)32萬(wàn)!這4種年份的1元硬幣,可要留好了!

富哥愛收藏
2026-03-26 13:51:45
爆料廣東隊(duì)教練組大調(diào)整,杜鋒面臨下課,替代者現(xiàn)身,球迷支持

爆料廣東隊(duì)教練組大調(diào)整,杜鋒面臨下課,替代者現(xiàn)身,球迷支持

宗介說(shuō)體育
2026-03-25 10:31:37
稀土案告破:截獲220噸,夠造90架F-35核心材料

稀土案告破:截獲220噸,夠造90架F-35核心材料

策略述
2026-03-26 13:45:33
62年胡宗南病逝,死前高舉左手驚叫數(shù)聲,其子:他常恨自己沒早死

62年胡宗南病逝,死前高舉左手驚叫數(shù)聲,其子:他常恨自己沒早死

云霄紀(jì)史觀
2026-03-26 11:47:26
女同主播出軌大哥 被"正宮"直播對(duì)質(zhì)!真實(shí)長(zhǎng)相曝光

女同主播出軌大哥 被"正宮"直播對(duì)質(zhì)!真實(shí)長(zhǎng)相曝光

游民星空
2026-03-25 20:08:13
如今三大戰(zhàn)場(chǎng)同時(shí)開打,中國(guó)一個(gè)舉動(dòng),卻是讓西方悟了一個(gè)道理

如今三大戰(zhàn)場(chǎng)同時(shí)開打,中國(guó)一個(gè)舉動(dòng),卻是讓西方悟了一個(gè)道理

近史談
2026-03-25 20:26:28
海關(guān)總署署長(zhǎng)孫梅君到廣東調(diào)研

海關(guān)總署署長(zhǎng)孫梅君到廣東調(diào)研

證券時(shí)報(bào)
2026-03-26 13:26:01
49年上海解放第三天,李克農(nóng)密電陳毅:不惜全部代價(jià),找著李靜安

49年上海解放第三天,李克農(nóng)密電陳毅:不惜全部代價(jià),找著李靜安

讓時(shí)間說(shuō)真話
2024-03-26 15:23:22
張雪峰去世,“跑完步就不行了”:蘇州獨(dú)墅湖醫(yī)院外的生死4小時(shí)

張雪峰去世,“跑完步就不行了”:蘇州獨(dú)墅湖醫(yī)院外的生死4小時(shí)

哲學(xué)船
2026-03-25 00:44:19
個(gè)人公眾號(hào)“千問(wèn)”停更近10年,近期接連遭阿里投訴均被駁回,號(hào)主:規(guī)避風(fēng)險(xiǎn)不發(fā)AI文章,如果我不發(fā)聲,賬號(hào)就不保了

個(gè)人公眾號(hào)“千問(wèn)”停更近10年,近期接連遭阿里投訴均被駁回,號(hào)主:規(guī)避風(fēng)險(xiǎn)不發(fā)AI文章,如果我不發(fā)聲,賬號(hào)就不保了

中國(guó)能源網(wǎng)
2026-03-25 13:53:05
留意!局部暴雨+短時(shí)大風(fēng),3月27日起廣東降水將趨于頻密

留意!局部暴雨+短時(shí)大風(fēng),3月27日起廣東降水將趨于頻密

新浪財(cái)經(jīng)
2026-03-26 03:04:38
五枚導(dǎo)彈,攔下四枚,就那漏網(wǎng)的一枚,不偏不倚,正好砸中…

五枚導(dǎo)彈,攔下四枚,就那漏網(wǎng)的一枚,不偏不倚,正好砸中…

福建平子
2026-03-25 10:14:49
2026-03-26 14:36:49
硅嶼手記
硅嶼手記
有態(tài)度網(wǎng)友ytd
666文章數(shù) 2關(guān)注度
往期回顧 全部

科技要聞

Meta高管狂分百億期權(quán),700名員工卻下崗

頭條要聞

伊朗議長(zhǎng)和外長(zhǎng)暫被移出美以清除名單 時(shí)限4到5天

頭條要聞

伊朗議長(zhǎng)和外長(zhǎng)暫被移出美以清除名單 時(shí)限4到5天

體育要聞

35歲替補(bǔ)門將,憑什么入選英格蘭隊(duì)?

娛樂(lè)要聞

張雪峰家人首發(fā)聲 不設(shè)追思會(huì)喪事從簡(jiǎn)

財(cái)經(jīng)要聞

黃仁勛:芯片公司的時(shí)代已經(jīng)結(jié)束了

汽車要聞

一汽奧迪A6L e-tron開啟預(yù)售 CLTC最大續(xù)航815km

態(tài)度原創(chuàng)

本地
時(shí)尚
教育
旅游
公開課

本地新聞

救命,這只醬板鴨已經(jīng)在我手機(jī)復(fù)仇了一萬(wàn)遍

2026年了,最好看的還是“這件針織”!

教育要聞

高考地理中的花海經(jīng)濟(jì)

旅游要聞

淡季旺銷!南明住宿業(yè)今年前兩月營(yíng)收斬獲1.18億元

公開課

李玫瑾:為什么性格比能力更重要?

無(wú)障礙瀏覽 進(jìn)入關(guān)懷版