分享自訂 Hooks 的重要性在於提供 React 開發者一個有效的方式,以促進代碼可讀性、可重用性和可維護性。自訂 Hooks 允許我們將複雜的邏輯和狀態管理抽象化,並與社群共享這些寶貴的資源。這不僅有助於加速應用程式開發,還能使新手更容易理解和運用 React 的強大功能。現在,讓我們深入研究七個常見的 Hooks,即 useCallback、useRef、useMemo、useReducer、useContext、useState、以及 useEffect,並提供每個 Hooks 的三個實際案例和解釋,讓您能更清楚地掌握這些強大的工具。讓我們開始吧!
useCallback 範例:
useRef 範例:
useMemo 範例:
useReducer 範例:
useContext 範例:
useState 範例:
useEffect 範例:
範例 1:使用 useContext 實現全域主題設定
import React, { createContext, useContext } from 'react';
// 創建一個上下文(Context)來存儲主題設定
const ThemeContext = createContext();
const ThemeProvider = ({ children }) => {
  const theme = 'light'; // 這裡假設主題是"light"
  return (
    <ThemeContext.Provider value={theme}>
      {children}
    </ThemeContext.Provider>
  );
}
const ThemedComponent = () => {
  // 使用 useContext Hook 獲取主題設定
  const theme = useContext(ThemeContext);
  return (
    <div className={`theme-${theme}`}>
      <p>目前主題:{theme}</p>
    </div>
  );
}
function App() {
  return (
    <ThemeProvider>
      <ThemedComponent />
    </ThemeProvider>
  );
}
export default App;
解釋:
ThemeContext 的上下文,用於存儲主題設定。useContext Hook 在 ThemedComponent 組件中獲取主題設定的值。ThemeProvider 組件中,我們將主題值設置為 "light",並將其通過上下文提供給所有子組件。App 組件中,我們包裹 ThemedComponent,使其可以訪問全域的主題設定。這個範例演示了如何使用 useContext Hook 實現全域主題設定,使所有子組件都能夠訪問和使用相同的主題值。
範例 2:使用 useReducer 管理狀態
import React, { useReducer } from 'react';
// 定義一個 reducer 函數來處理狀態變化
const counterReducer = (state, action) => {
  switch (action.type) {
    case 'INCREMENT':
      return { count: state.count + 1 };
    case 'DECREMENT':
      return { count: state.count - 1 };
    default:
      return state;
  }
}
const Counter = () => {
  // 使用 useReducer Hook 初始化狀態和 dispatch 函數
  const [state, dispatch] = useReducer(counterReducer, { count: 0 });
  // 定義處理按鈕點擊的函數,並分發對應的動作
  const handleIncrement = () => {
    dispatch({ type: 'INCREMENT' });
  };
  const handleDecrement = () => {
    dispatch({ type: 'DECREMENT' });
  };
  return (
    <div>
      <p>計數:{state.count}</p>
      <button onClick={handleIncrement}>增加</button>
      <button onClick={handleDecrement}>減少</button>
    </div>
  );
}
export default Counter;
解釋:
counterReducer 的 reducer 函數,它處理狀態的變化,根據動作的類型進行增加或減少操作。Counter 組件中,我們使用 useReducer Hook 初始化狀態和 dispatch 函數,並將 counterReducer 作為第一個參數傳遞。dispatch 函數,以更新狀態。state.count)在界面上顯示,並在按鈕上設置點擊事件處理程序,以執行增加和減少操作。這個範例演示了如何使用 useReducer Hook 來管理複雜的狀態邏輯,並使用 reducer 函數處理不同的動作。