context vs. RTK
1. 基本定位
- 
Context API - 
React 內建工具,用來避免「props drilling」(層層傳遞 props)。 
- 
適合 少量、簡單的全域狀態(例如:主題顏色、登入使用者資訊、語系設定)。 
- 
不提供複雜的狀態管理功能(像是 middleware、immutable 更新、時間旅行)。 
 
- 
- 
Redux Toolkit (RTK) - 
Redux 官方推薦的標準工具,幫助你用更少樣板程式碼(boilerplate)來寫 Redux。 
- 
適合 中大型應用,需要明確的狀態流、可預測的更新、除錯工具(Redux DevTools)、middleware(例如 API 請求攔截、log 記錄)。 
- 
支援結合 RTK Query 做資料快取與 API 狀態管理。 
 
- 
2. 使用範例
Context API
// ThemeContext.js
import { createContext, useState } from "react";
export const ThemeContext = createContext();
export function ThemeProvider({ children }) {
  const [theme, setTheme] = useState("light");
  return (
    <ThemeContext.Provider value={{ theme, setTheme }}>
      {children}
    </ThemeContext.Provider>
  );
}
// 使用
import { useContext } from "react";
import { ThemeContext } from "./ThemeContext";
function Button() {
  const { theme, setTheme } = useContext(ThemeContext);
  return (
    <button onClick={() => setTheme(theme === "light" ? "dark" : "light")}>
      Current theme: {theme}
    </button>
  );
}
很適合單純的「全域設定」。
Redux Toolkit
// store.js
import { configureStore, createSlice } from "@reduxjs/toolkit";
const counterSlice = createSlice({
  name: "counter",
  initialState: { value: 0 },
  reducers: {
    increment: (state) => {
      state.value += 1;
    },
    decrement: (state) => {
      state.value -= 1;
    },
  },
});
export const { increment, decrement } = counterSlice.actions;
export const store = configureStore({
  reducer: { counter: counterSlice.reducer },
});
// 使用
import { useSelector, useDispatch } from "react-redux";
import { increment, decrement } from "./store";
function Counter() {
  const count = useSelector((state) => state.counter.value);
  const dispatch = useDispatch();
  return (
    <>
      <button onClick={() => dispatch(decrement())}>-</button>
      <span>{count}</span>
      <button onClick={() => dispatch(increment())}>+</button>
    </>
  );
}
適合「複雜邏輯、多模組、跨頁面」的應用。
3. 差異整理
| 面向 | Context API | Redux Toolkit (RTK) | 
|---|---|---|
| 定位 | React 內建的 props 傳遞替代方案 | 官方推薦的 Redux 寫法 | 
| 複雜度 | 簡單、輕量 | 中高,結構化 | 
| 適合場景 | 主題、登入狀態、語系 | 中大型專案、複雜邏輯、多 API | 
| 性能 | 任何 context 更新會觸發所有消費者重新渲染 | 透過 useSelector,可避免無關組件重渲染 | 
| 工具支援 | 無 | Redux DevTools、middleware、RTK Query | 
| 資料流 | 比較自由,容易混亂 | 嚴格單向流,狀態可追蹤 | 
結論:
- 
如果只是小專案 or 少數全域狀態 → Context 就夠了。 
- 
如果是中大型專案,需要 狀態集中管理、可預測、可除錯 → RTK 比較合適。