1. ??Hooks 是什么???
Hooks 是 React 16.8 引入的函數式組件特性,允許在不編寫 class 的情況下使用 state 和其他 React 特性(如生命周期、副作用等)。??本質是一類特殊函數??,它們掛載到 React 的調度系統中,在組件渲染時被調用,以“鉤入”React 的核心功能。
2. ??Hooks 的底層原理??
- ??鏈表結構??:Hooks 通過單向鏈表記錄狀態。每次組件渲染時,React 會按順序遍歷鏈表,讀取或更新對應的狀態。
- ??調用順序規則??:Hooks 必須保證每次渲染的調用順序一致(不能嵌套在條件/循環中),因為 React 依賴調用順序來關聯狀態。
- ??閉包與作用域??:Hooks 利用閉包保存當前組件的上下文(如?
useState
?的 state 值)。
3. ??常用 Hooks 及用途??
Hook 名稱 | 作用描述 | 示例場景 |
---|---|---|
useState | 管理組件內部狀態 | 計數器、表單輸入 |
useEffect | 處理副作用(數據獲取、DOM 操作等) | API 請求、事件監聽、定時器 |
useContext | 跨組件層級共享數據(替代部分 Redux 場景) | 主題切換、用戶身份傳遞 |
useReducer | 復雜狀態邏輯管理(類似 Redux 的 reducer) | 多狀態聯動、表單校驗 |
useCallback | 緩存函數,避免子組件不必要的重渲染 | 性能優化(配合?React.memo ) |
useMemo | 緩存計算結果,避免重復計算 | 復雜計算、過濾列表數據 |
useRef | 獲取 DOM 引用或保存可變值(不觸發渲染) | 聚焦輸入框、保存定時器 ID |
useLayoutEffect | 類似?useEffect ,但同步執行(在 DOM 更新后、瀏覽器繪制前) | 測量 DOM 尺寸后同步更新 |
4. ??Hooks 的核心用途??
- ??邏輯復用??:通過自定義 Hook(如?
useFetch
)封裝可復用的邏輯,避免高階組件(HOC)的嵌套問題。 - ??簡化組件??:函數組件 + Hooks 替代 class 組件,代碼更簡潔(無需?
this
、生命周期方法)。 - ??關注點分離??:將相關邏輯聚合到獨立的 Hook 中(如數據獲取與狀態管理分離)。
5. ??Hooks 的本質??
Hooks 是 React 提供的一組 API,它們:
- ??不是魔法??:底層基于 JavaScript 的閉包和鏈表實現。
- ??與 Fiber 架構協同??:React 的 Fiber 調度機制跟蹤 Hooks 的調用順序和狀態。
- ??約束性設計??:通過規則(如“只在頂層調用”)保證狀態的一致性。
示例代碼:自定義 Hook
// 自定義 Hook:監聽窗口大小
function useWindowSize() {const [size, setSize] = useState({ width: window.innerWidth, height: window.innerHeight });useEffect(() => {const handleResize = () => setSize({ width: window.innerWidth, height: window.innerHeight });window.addEventListener('resize', handleResize);return () => window.removeEventListener('resize', handleResize);}, []);return size;
}// 使用
function MyComponent() {const { width } = useWindowSize();return <div>Window width: {width}px</div>;
}
注意事項
- ??條件調用禁止??:Hooks 必須在組件頂層調用,不可動態增減。
- ??性能優化??:合理使用?
useMemo
/useCallback
?避免過度渲染。 - ??閉包陷阱??:
useEffect
?的依賴數組需正確處理(如使用?useRef
?解決過期閉包)。
Hooks 的設計使 React 函數組件具備了完整能力,同時推動了前端開發向函數式編程風格的演進。