📚 前言
React 的函數組件 + Hooks 模式已經成為現代前端開發的主流。相比類組件,Hooks 讓狀態管理和副作用處理更加簡潔和可復用。但在實際開發中,除了常用的 useState
和 useEffect
,還有很多“進階武器”值得我們掌握。
本文將深入講解三個核心 Hook:useReducer
、useEffect
、useRef
,并揭秘一個常被忽視但極具潛力的 HTML 屬性——is
在 React 中的應用場景,助你寫出更優雅、更高效的 React 代碼。
一、useReducer
:復雜狀態管理的利器
1.1 什么是?useReducer
?
useReducer
是 React 提供的一個 Hook,用于管理組件中復雜的狀態邏輯。它類似于 Redux 的 reducer 模式,但更輕量,無需引入額外庫。
1.2 基本語法
const [state, dispatch] = useReducer(reducer, initialState);
reducer
:一個純函數?(state, action) => newState
initialState
:初始狀態dispatch
:用于派發動作(action)來更新狀態
1.3 使用場景
? 狀態結構復雜(如嵌套對象)
? 多個狀態相互依賴
? 狀態更新邏輯較多
1.4 示例:計數器
function reducer(state, action) {switch (action.type) {case 'increment': return { count: state.count + 1 };case 'decrement': return { count: state.count - 1 };default: throw new Error();}
}function Counter() {const [state, dispatch] = useReducer(reducer, { count: 0 });return (<div>Count: {state.count}<button onClick={() => dispatch({ type: 'increment' })}>+</button><button onClick={() => dispatch({ type: 'decrement' })}>-</button></div>);
}
💡 優點:邏輯集中、可預測、易于測試。
二、useEffect
:副作用的管理中心
2.1 什么是?useEffect
?
useEffect
用于在函數組件中執行副作用操作,如數據獲取、訂閱、手動 DOM 操作等。它是 componentDidMount
、componentDidUpdate
和 componentWillUnmount
的組合。
2.2 基本語法
useEffect(() => {// 副作用邏輯return () => {// 清理邏輯(可選)};
}, [dependencies]);
2.3 常見用法
? 組件掛載后執行一次
useEffect(() => {fetchData();
}, []); // 空依賴數組 → 只執行一次
? 監聽某個狀態變化
useEffect(() => {fetchUserData(userId);
}, [userId]); // userId 變化時重新執行
? 清理資源(防止內存泄漏)
useEffect(() => {const timer = setInterval(() => console.log('tick'), 1000);return () => clearInterval(timer); // 組件卸載時清理
}, []);
?? 注意:避免無限循環、正確處理異步操作。
三、useRef
:持久化引用的“盒子”
3.1 什么是?useRef
?
useRef
返回一個可變的引用對象,其 .current
屬性可以保存任意值,并且修改它不會觸發組件重新渲染。
3.2 核心用途
? 1. 訪問 DOM 元素
const inputRef = useRef(null);
useEffect(() => {inputRef.current.focus(); // 自動聚焦
}, []);
<input ref={inputRef} type="text" />
? 2. 存儲可變變量(不觸發重渲染)
const timerRef = useRef(null);
timerRef.current = setInterval(...);
// 清理時使用 clearInterval(timerRef.current)
? 3. 獲取上一次的值
function usePrevious(value) {const ref = useRef();useEffect(() => { ref.current = value; });return ref.current;
}
📌 關鍵區別:
useRef
不會觸發重渲染,而useState
會。
四、is
?屬性:Web Components 的秘密武器
4.1?is
?是 React 關鍵詞嗎?
? 不是! is
是 HTML 標準屬性,用于定義自定義內置元素(Customized Built-in Elements),屬于 Web Components 技術棧。
4.2 作用與語法
讓一個自定義元素繼承原生 HTML 元素的行為:
<button is="custom-toggle-button">切換</button>
4.3 在 React 中的使用
<button is="fancy-button" onClick={handleClick}>提交
</button>
前提:已通過 customElements.define('fancy-button', ...)
注冊組件。
4.4 注意事項
- 僅在使用 Web Components 時需要
- 不要誤用于條件渲染(如?
<div is={true}>
??) - 老瀏覽器需 polyfill 支持
? 總結對比
特性 | useReducer | useEffect | useRef | is ?屬性 |
---|---|---|---|---|
用途 | 管理復雜狀態 | 處理副作用 | 持久化引用 | 擴展原生元素 |
是否觸發重渲染 | 否(通過 dispatch) | 否(副作用本身) | 否 | 否 |
典型場景 | 表單、多狀態聯動 | 數據請求、定時器 | DOM 操作、實例變量 | Web Components |
是否 React 獨有 | ? 是 | ? 是 | ? 是 | ? 否(HTML 標準) |
🎯 寫在最后
掌握 useReducer
、useEffect
、useRef
是成為 React 高手的必經之路,而了解 is
屬性則能讓你在面對 Web Components 項目時游刃有余。
希望本文能幫助你更好地理解這些知識點,并在實際項目中靈活運用。如果你覺得有收獲,歡迎點贊、收藏、轉發!
關注我,持續輸出前端干貨!
評論區歡迎交流:你在項目中是如何使用這些特性的?