1. 主页 > 好文章

React性能优化:函数缓存的最佳实践与常见问题

鍝庯紝浣犵殑React搴旂敤鏄笉鏄秺鏉ヨ秺鎱簡锛熷氨鍍忔垜鍘诲勾鍋氱殑閭d釜鍚庡彴绠$悊绯荤粺鈥斺€旀槑鏄庡彧鏈変簩鍗佸嚑涓粍浠讹紝鐐逛釜鎸夐挳閮借鍗′笁绉掞紒鍚庢潵鎻嚭缃瓉绁搁鎵嶅彂鐜帮紝鍘熸潵鏄嚱鏁板湪鍋峰伔鎼炰簨鎯呫€備粖澶╁氨甯﹀ぇ瀹舵墥涓€鎵掞紝鎬庝箞鐢ㄥ嚱鏁扮紦瀛樿浣犵殑搴旂敤椋炶捣鏉ヰ煔€


馃幆 鍏堟悶鏄庣櫧锛氱紦瀛樺嚱鏁板埌搴曞浘涓暐锛?/h3>

涓句釜琛€娉暀璁細鎴戠粰鎼滅储妗嗗啓浜嗚繖涔堜釜澶勭悊鍑芥暟

javascript澶嶅埗
function SearchBox() {
  const handleInput = (e) => {
    // 澶勭悊鎼滅储閫昏緫...
  }
  return <input onChange={handleInput} />
}

缁撴灉鐢ㄦ埛姣忚緭鍏ヤ竴涓瓧锛屾暣涓垪琛ㄧ粍浠堕兘瑕佹姈涓夋姈锛佷负鍟ワ紵鈥?strong>鈥嬫瘡娆¤緭鍏ラ兘鍒涘缓鏂板嚱鏁扳€?/strong>鈥嬶紝瀵艰嚧瀛愮粍浠朵互涓簆rops鍙樹簡銆傝繖鏃跺€欏氨璇ョキ鍑哄挶浠殑缂撳瓨鍙岄泟浜嗮煈?/p>


馃洜锔?涓ゅぇ绁炲櫒璇ユ€庝箞鐢紵

  1. 鈥?strong>鈥媢seCallback鈥斺€斾笓娌诲嚱鏁板鍔ㄧ棁鈥?/strong>鈥?br/> 鏀归€犱笂闈㈢殑渚嬪瓙锛?/p>

    javascript澶嶅埗
    const handleInput = useCallback((e) => {
      // 澶勭悊閫昏緫
    }, []);  

    绌烘暟缁勫氨鍍忕粰鍑芥暟濂椾簡閲戦挓缃╋紝鍛婅瘔React锛?杩欎釜鍑芥暟鎵撴閮戒笉鍙橈紒"

  2. 鈥?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鑰楁椂
浜嬩欢澶勭悊鍑芥暟15ms28ms
澶ф暟鎹繃婊?/td>32ms18ms

缁撹锛氣€?strong>鈥嬫潃楦″埆鐢ㄧ墰鍒€锛岄€€楀瓙杩樺緱闈犵尗鈥?/strong>鈥嬶紒


馃挕 鐙鎬ц兘绉樻柟

鍘诲勾閲嶆瀯鐢靛晢骞冲彴鏃跺彂鐜颁釜鐜勫鐜拌薄锛氣€?strong>鈥嬭繃搴︾紦瀛樻瘮涓嶇紦瀛樿繕鍙€曗€?/strong>鈥嬶紒鏈変釜鍟嗗搧绛涢€夐〉鐢ㄤ簡涓夊眰宓屽缂撳瓨锛屽唴瀛樺崰鐢ㄧ洿鎺ラ鍒?.2GB銆傚悗鏉ユ敼鐢≧eact.memo+鍚堢悊缂撳瓨锛屾€ц兘鍙嶈€屾彁鍗?0%銆?/p>

杩欓噷缁欎釜鍌荤摐鍏紡锛?/p>

闇€瑕佽法缁勪欢浼犻€掑嚱鏁?鈫?鐢╱seCallback  
闇€瑕佺紦瀛樿绠楃粨鏋?鈫?鐢╱seMemo  
鍏朵粬鎯呭喌 鈫?鍏堝埆鎬ョ潃缂撳瓨锛?/code>

馃搱 鐪熷疄椤圭洰鏁版嵁璇磋瘽

鎴戜滑鍥㈤槦鍋氳繃AB娴嬭瘯锛氬湪鍖呭惈50涓姩鎬佽〃鍗曠粍浠剁殑椤甸潰涓紝鍚堢悊浣跨敤缂撳瓨鍚庯細

  • 棣栨娓叉煋閫熷害鎻愬崌62%
  • 浜や簰鍝嶅簲鏃堕棿缂╃煭78%
  • 鍐呭瓨鍗犵敤鍑忓皯34%

浣嗘湁涓弽甯歌瘑鍙戠幇锛氣€?strong>鈥嬬害15%鐨勭紦瀛樹娇鐢ㄥ弽鑰屾嫋鎱簡鎬ц兘鈥?/strong>鈥嬶紒鎵€浠ュ晩锛屽崈涓囧埆鎶婄紦瀛樺綋涓囪兘鑶忚嵂锛屽摢鍎跨柤寰€鍝効璐淬€?/p>

本文由嘻道妙招独家原创,未经允许,严禁转载