useCallback vs useMemo
A comprehensive guide to React performance optimization using useCallback and useMemo with real-world examples
React 效能優化:從實際問題出發
難度:Medium
目標:從實際開發問題出發,深入理解 React 效能優化的核心概念和最佳實踐
核心重點
- 理解效能問題的本質
- 掌握優化工具的使用時機
- 學習 React 內部優化機制
- 實戰案例分析與解決方案
學習成果
- 能夠診斷和解決效能問題
- 掌握 React 記憶化 API
- 理解元件渲染原理
- 實踐最佳優化方案
React
Performance
Hooks
Optimization
1. 從問題開始
1.1 常見效能問題
從一個實際的例子開始:
1.2 問題分析
效能瓶頸
- SearchInput 會因為 handleSearch 函數重新創建而重新渲染
- 排序操作在每次渲染時重複執行
- SearchResults 會因為 sortedResults 重新創建而重新渲染
2. 理解核心概念
2.1 React 的渲染機制
2.2 記憶化的本質
記憶化是一種用空間換時間的優化技術:
3. 優化工具深入解析
3.1 useCallback vs useMemo
3.2 React.memo 的角色
4. 實戰案例分析
4.1 搜尋功能優化
4.2 表單處理優化
5. 效能優化
5.1 優化方式選擇
策略 | 使用時機 | 注意事項 |
---|---|---|
使用 children | 靜態內容 | React 內建優化,優先考慮 |
狀態下移 | 局部狀態 | 符合單一職責原則 |
使用 memo | 複雜元件 | 需要配合 useCallback/useMemo |
5.2 依賴陣列優化
5.3 Children Props 優化
6. 常見面試題目
6.1 效能優化問題
Q1: 如何避免不必要的重渲染?
答題思路:
- 分析重渲染的原因
- 提供多層次的解決方案
- 比較不同方案的優缺點
6.2 memo vs useMemo 的關鍵差異
核心差異
- 使用目的不同
memo
: 用於記憶化整個元件useMemo
: 用於記憶化計算結果(值)
- 使用層級不同
memo
: 元件層級的優化useMemo
: 值層級的優化
- 觸發重新計算的條件不同
memo
: 只有當 props 改變時才重新渲染useMemo
: 只有當依賴陣列中的值改變時才重新計算
使用建議
- 使用
memo
當:- 元件經常重新渲染
- 元件渲染很耗時
- 元件的 props 很少改變
- 使用
useMemo
當:- 需要記憶化複雜計算的結果
- 需要避免在每次渲染時創建新的物件
- 計算結果被用作其他 hooks 的依賴
效能優化檢查清單
- ✅ 使用 React.memo() 記憶化元件
- ✅ 使用 useCallback() 記憶化函數
- ✅ 使用 useMemo() 記憶化計算結果
- ✅ 優化依賴陣列
- ✅ 使用 children prop 優化
- ✅ 實施狀態下移
- ✅ 使用效能監測工具