React性能优化:函数缓存的最佳实践与常见问题
鍝庯紝浣犵殑React搴旂敤鏄笉鏄秺鏉ヨ秺鎱簡锛熷氨鍍忔垜鍘诲勾鍋氱殑閭d釜鍚庡彴绠$悊绯荤粺鈥斺€旀槑鏄庡彧鏈変簩鍗佸嚑涓粍浠讹紝鐐逛釜鎸夐挳閮借鍗′笁绉掞紒鍚庢潵鎻嚭缃瓉绁搁鎵嶅彂鐜帮紝鍘熸潵鏄嚱鏁板湪鍋峰伔鎼炰簨鎯呫€備粖澶╁氨甯﹀ぇ瀹舵墥涓€鎵掞紝鎬庝箞鐢ㄥ嚱鏁扮紦瀛樿浣犵殑搴旂敤椋炶捣鏉ヰ煔€
馃幆 鍏堟悶鏄庣櫧锛氱紦瀛樺嚱鏁板埌搴曞浘涓暐锛?/h3>
涓句釜琛€娉暀璁細鎴戠粰鎼滅储妗嗗啓浜嗚繖涔堜釜澶勭悊鍑芥暟
javascript澶嶅埗function SearchBox() { const handleInput = (e) => { // 澶勭悊鎼滅储閫昏緫... } return <input onChange={handleInput} /> }
缁撴灉鐢ㄦ埛姣忚緭鍏ヤ竴涓瓧锛屾暣涓垪琛ㄧ粍浠堕兘瑕佹姈涓夋姈锛佷负鍟ワ紵鈥?strong>鈥嬫瘡娆¤緭鍏ラ兘鍒涘缓鏂板嚱鏁扳€?/strong>鈥嬶紝瀵艰嚧瀛愮粍浠朵互涓簆rops鍙樹簡銆傝繖鏃跺€欏氨璇ョキ鍑哄挶浠殑缂撳瓨鍙岄泟浜嗮煈?/p>
馃洜锔?涓ゅぇ绁炲櫒璇ユ€庝箞鐢紵
-
鈥?strong>鈥媢seCallback鈥斺€斾笓娌诲嚱鏁板鍔ㄧ棁鈥?/strong>鈥?br/> 鏀归€犱笂闈㈢殑渚嬪瓙锛?/p>
javascript澶嶅埗
const handleInput = useCallback((e) => { // 澶勭悊閫昏緫 }, []);
绌烘暟缁勫氨鍍忕粰鍑芥暟濂椾簡閲戦挓缃╋紝鍛婅瘔React锛?杩欎釜鍑芥暟鎵撴閮戒笉鍙橈紒"
-
鈥?strong>鈥媢seMemo鈥斺€斿浠樿绠楀瀷鏆磋蛋鈥?/strong>鈥?br/> 閬囧埌闇€瑕佸鏉傝绠楃殑鍦烘櫙锛?/p>
javascript澶嶅埗
const filteredData = useMemo(() => data.filter(item => item.price > 100), [data]);
瀹炴祴鏁版嵁閲忚繃涓囨椂锛屾覆鏌撻€熷害鑳藉揩5鍊嶄笉姝紒
鉂?鏂版墜蹇呰俯鐨勪笁澶у潙
鏈€杩戞湁涓鍛樺彂鏉ョ殑浠g爜璁╂垜绗戝嚭鐚彨锛?/p>
javascript澶嶅埗useCallback(() => { console.log(stateA, stateB); }, [stateA]); // 婕忎簡stateB渚濊禆锛?/span>
杩欏氨濂芥瘮鍑洪棬鍙甫閽ュ寵涓嶅甫鎵嬫満鈥斺€旀棭鏅氳鍑轰簨锛佲€?strong>鈥嬮棴鍖呴噷鐨勫彉閲忎竴涓兘涓嶈兘婕忊€?/strong>鈥嬶紝璺熸煡閰掗┚浼肩殑鎸ㄤ釜鎺掓煡銆?/p>
鍐嶆潵鐪嬩釜鍏稿瀷閿欒锛?/p>
javascript澶嶅埗// 鉂?缂撳瓨鏁翠釜閰嶇疆瀵硅薄 const config = useMemo(() => ({ color: mode === 'dark' ? 'black' : 'white' }), [mode]);
鍏跺疄搴旇鎷嗗紑鍐欙細
javascript澶嶅埗const color = useMemo(() => mode === 'dark' ? 'black' : 'white', [mode]);
鍒棶锛岄棶灏辨槸琚繖绉嶅啓娉曞潙绉冭繃锛?/p>
馃 鐏甸瓊鎷烽棶鏃堕棿
鈥?strong>鈥婹锛氭墍鏈夊嚱鏁伴兘瑕佺紦瀛樺悧锛熲€?/strong>鈥?br/> A锛氬ぇ婕忕壒婕忥紒姣斿杩欑绾伐鍏峰嚱鏁帮細
javascript澶嶅埗const add = (a, b) => a + b;
缁欏畠鍔犵紦瀛樺氨鍍忕粰鑷杞﹁娑¤疆澧炲帇鈥斺€旂函灞炲浣欙紒
鈥?strong>鈥婹锛歶seMemo鑳戒唬鏇縰seCallback鍚楋紵鈥?/strong>鈥?br/> 鐪嬩釜瀵规瘮瀹為獙锛?/p>
鍦烘櫙 | useCallback鑰楁椂 | useMemo鑰楁椂 |
---|---|---|
浜嬩欢澶勭悊鍑芥暟 | 15ms | 28ms |
澶ф暟鎹繃婊?/td> | 32ms | 18ms |
缁撹锛氣€?strong>鈥嬫潃楦″埆鐢ㄧ墰鍒€锛岄€€楀瓙杩樺緱闈犵尗鈥?/strong>鈥嬶紒
馃挕 鐙鎬ц兘绉樻柟
鍘诲勾閲嶆瀯鐢靛晢骞冲彴鏃跺彂鐜颁釜鐜勫鐜拌薄锛氣€?strong>鈥嬭繃搴︾紦瀛樻瘮涓嶇紦瀛樿繕鍙€曗€?/strong>鈥嬶紒鏈変釜鍟嗗搧绛涢€夐〉鐢ㄤ簡涓夊眰宓屽缂撳瓨锛屽唴瀛樺崰鐢ㄧ洿鎺ラ鍒?.2GB銆傚悗鏉ユ敼鐢≧eact.memo+鍚堢悊缂撳瓨锛屾€ц兘鍙嶈€屾彁鍗?0%銆?/p>
杩欓噷缁欎釜鍌荤摐鍏紡锛?/p>
闇€瑕佽法缁勪欢浼犻€掑嚱鏁?鈫?鐢╱seCallback
闇€瑕佺紦瀛樿绠楃粨鏋?鈫?鐢╱seMemo
鍏朵粬鎯呭喌 鈫?鍏堝埆鎬ョ潃缂撳瓨锛?/code>
馃搱 鐪熷疄椤圭洰鏁版嵁璇磋瘽
鎴戜滑鍥㈤槦鍋氳繃AB娴嬭瘯锛氬湪鍖呭惈50涓姩鎬佽〃鍗曠粍浠剁殑椤甸潰涓紝鍚堢悊浣跨敤缂撳瓨鍚庯細
- 棣栨娓叉煋閫熷害鎻愬崌62%
- 浜や簰鍝嶅簲鏃堕棿缂╃煭78%
- 鍐呭瓨鍗犵敤鍑忓皯34%
浣嗘湁涓弽甯歌瘑鍙戠幇锛氣€?strong>鈥嬬害15%鐨勭紦瀛樹娇鐢ㄥ弽鑰屾嫋鎱簡鎬ц兘鈥?/strong>鈥嬶紒鎵€浠ュ晩锛屽崈涓囧埆鎶婄紦瀛樺綋涓囪兘鑶忚嵂锛屽摢鍎跨柤寰€鍝効璐淬€?/p>
本文由嘻道妙招独家原创,未经允许,严禁转载