首頁chevron_right文章列表chevron_rightReact 狀態管理最佳實踐
技術文章calendar_today 2026-01-13

React 狀態管理最佳實踐

探討 React 應用中的狀態管理策略,從 useState 到 Context API,再到第三方解決方案。

React 狀態管理最佳實踐

狀態管理是 React 開發中最重要的議題之一。本文將探討不同場景下的最佳實踐。

本地狀態 vs 全域狀態

何時使用本地狀態

對只在單一元件內使用的資料,使用 useState 就足夠了:

function Counter() {
  const [count, setCount] = useState(0);
  
  return (
    <button onClick={() => setCount(count + 1)}>
      Count: {count}
    </button>
  );
}

何時需要全域狀態

以下情況建議使用全域狀態:

  • 多個不相關的元件需要共享資料
  • 需要在深層嵌套的元件間傳遞資料
  • 狀態需要持久化

Context API 使用指南

建立 Context

Context 是 React 內建的狀態共享機制:

const ThemeContext = createContext();

function ThemeProvider({ children }) {
  const [theme, setTheme] = useState("light");
  
  return (
    <ThemeContext.Provider value={{ theme, setTheme }}>
      {children}
    </ThemeContext.Provider>
  );
}

避免過度使用

Context 的缺點:

  • 所有消費者都會在 Context 值變化時重新渲染
  • 不適合頻繁變化的狀態
  • 除錯較困難

第三方狀態管理工具

Zustand - 輕量級選擇

Zustand 提供簡潔的 API:

import create from "zustand";

const useStore = create((set) => ({
  count: 0,
  increment: () => set((state) => ({ count: state.count + 1 })),
}));

Redux Toolkit - 企業級方案

對於大型應用,Redux Toolkit 提供:

  • 可預測的狀態更新
  • 強大的開發工具
  • 中間件支援
  • 時間旅行除錯

效能優化

使用 useMemo 和 useCallback

避免不必要的重新計算:

const expensiveValue = useMemo(() => {
  return computeExpensiveValue(a, b);
}, [a, b]);

const handleClick = useCallback(() => {
  doSomething(a, b);
}, [a, b]);

狀態分割

將狀態分割成更小的單元:

  • 減少不必要的重新渲染
  • 提高程式碼可維護性
  • 更容易測試

伺服器狀態管理

React Query 的優勢

React Query 專為伺服器狀態設計:

function Users() {
  const { data, isLoading } = useQuery("users", fetchUsers);
  
  if (isLoading) return <div>Loading...</div>;
  return <UserList users={data} />;
}

優點:

  • 自動快取
  • 背景重新獲取
  • 樂觀更新
  • 請求去重

最佳實踐總結

  1. 從簡單開始:優先使用 useState 和 props
  2. 按需升級:需要時才引入 Context 或狀態管理庫
  3. 分離關注點:伺服器狀態和客戶端狀態應該分開管理
  4. 效能為先:使用 memo、useMemo 和 useCallback 優化

結論

選擇正確的狀態管理策略能大幅提升開發效率和應用效能。記住,沒有銀彈,根據專案需求選擇最適合的方案才是王道。