Zustand:
輕量全域狀態管理
比 Redux 簡單 10 倍、比 Context 效能更好 — 2026 年最推薦的 React 狀態管理方案
Section 1:為什麼需要 Zustand
在 EP.21 我們學了 Context API,它解決了「prop drilling」問題。但當應用規模增大,Context 和 Redux 各自都有明顯的痛點。Zustand 正是為了解決這兩者的問題而生。
Context API 的效能陷阱
Context 最大的問題是「粒度太粗」。只要 Context 的 value 物件有任何一個欄位改變,所有訂閱該 Context 的 Consumer 元件都會強制重新渲染,即使它根本沒有用到那個改變的欄位。
Redux 的問題:學習成本與樣板程式碼
Redux 功能強大,但即使是最現代的 Redux Toolkit 版本,也需要引入大量概念與多個檔案才能完成一個功能。對中小型應用來說,這個成本往往不值得。
Zustand 的解法
Zustand(德文「狀態」的意思)只有 2KB,一個 package,整個 store 只需要 20 行。它採用 hook-based API,不需要 Provider,任何元件直接 import 就能使用。
Section 2:第一個 Store
用最簡單的計數器範例來理解 Zustand 的核心 API。整個 store 的建立非常直覺——你只需要定義 state 和能修改它的函式,全部寫在一個地方。
建立 Store
在元件中使用
Zustand 最大的優點之一:不需要 Provider 包裹。任何元件只要 import hook 就能直接取用 store 中的值,包含在完全不同的元件樹中。
重點對比
Context 需要:createContext → Provider 包裹 → useContext,且 value 改變時所有 Consumer 都重渲染。
Zustand 只需要:import hook → 選擇器,且只有選擇的值改變時才重渲染。
Section 3:完整的購物車 Store
在 EP.25 我們用 useReducer + Context 實作了購物車,需要分開的 reducer 函式、action types、Context 建立和 Provider 設定。現在用 Zustand 改寫,程式碼量大幅減少,而且還能免費得到 localStorage 持久化。
購物車 Store(含自動持久化)
在各元件中使用
各元件只訂閱自己需要的部分,彼此完全解耦。不需要任何 Provider,不需要透過 props 傳遞回調函式。
persist middleware 的魔力
加上 persist 之後,使用者重新整理頁面、關閉瀏覽器重開,購物車內容都會保留。這在 Context 或純 Redux 中需要自己寫 localStorage 邏輯,Zustand 一行搞定。
Section 4:Middleware — devtools + persist + immer
Zustand 的 middleware 系統讓你可以按需疊加功能。三個最常用的 middleware:devtools(除錯)、persist(持久化)、immer(簡化 state 更新)。它們可以自由組合。
devtools — 連接 Redux DevTools
安裝 Redux DevTools 瀏覽器擴充後,加上 devtools middleware 即可在瀏覽器中時間旅行除錯,查看每次 state 改變的歷史記錄。
immer — 直接 mutate state
immer middleware 讓你在 set 函式中直接修改 state(mutate),不需要手動 spread 展開。immer 在背後幫你產生不可變的新 state。
組合多個 Middleware
三個 middleware 可以同時使用,用括號依序包裹即可。注意順序:通常 devtools 在最外層,persist 次之,immer 在最內層。
Section 5:選擇器優化 — 防止不必要的 re-render
Zustand 的 selector 是它效能優於 Context 的關鍵機制。正確使用 selector,可以確保元件只在它真正關心的資料改變時才重新渲染。
基本 Selector 用法
shallow — 訂閱多個欄位
當需要同時訂閱多個欄位時,selector 回傳的是一個新物件,每次呼叫都會建立新物件參考(即使內容相同),會造成不必要的 re-render。解法是使用 shallow 進行淺比較。
訂閱模式的效能階梯
Section 6:Zustand vs Context vs Redux 完整對比
三種狀態管理方案各有適合的場景,沒有絕對的好壞。理解各自的特性,才能在適合的時機選用正確的工具。
| 比較項目 | Context API | Zustand | Redux Toolkit |
|---|---|---|---|
| Bundle size | 0 KB(內建) | 2 KB | 30+ KB |
| 學習成本 | 低 | 低 | 高 |
| 效能優化 | 需手動 useMemo | 自動 selector | 需 reselect |
| DevTools | ❌ | ✅(middleware) | ✅ |
| 持久化 | 需自己寫 | ✅(middleware) | 需 redux-persist |
| Provider 包裹 | 需要 | 不需要 | 需要 |
| TypeScript | 好 | 很好 | 很好 |
| 適合場景 | 主題/語言設定 | 中大型應用 | 超大型應用 |
| 學習資源 | 官方文件完整 | 文件簡潔清晰 | 生態系最完整 |
2026 年建議選用路線
學習路線建議
如果你正在學 React,建議的順序是:先搞懂 useState + useReducer(EP.17、25),理解 Context(EP.21),然後直接跳到 Zustand。Redux 可以等到真的遇到超大型專案再學,大多數個人、中小型商業專案用 Zustand 完全夠用。