開源專案
pmndrs/zustand avatar
pmndrs/zustand

Zustand:把 React 状態收進一個可選择的 Hook

承擔React中狀態管理的需要。如果你想建構一個內部有多個state-picks的單一對象,類似於redux的mapStateToProps,你可以使用useShallow來防止當選擇器輸出不根據shallow equal改變時不必要的重新渲染。

58,679 個 Star2,187 個 ForkTypeScriptMIT

秒懂

它是什麼?
從 create、選择器到 vanilla store,分析 Zustand 的状態边界、中間件和适用条件。
適合誰用?
Zustand 适合希望用較少样板代码管理 React 共享状態、並能接受 action 與 store 同處一處的团队。它不适合把 context 注入、状態替換語義或服务端隔离问題交给默認配置的人。
可以商用嗎?
可以。MIT 是寬鬆授權:你可以使用、修改並販售以它為基礎的軟體,只需保留著作權與授權聲明。
還在維護嗎?
有在維護。儲存庫最近一次提交在 5 天前。
用什麼語言寫的?
主要是 TypeScript(依據 GitHub 的語言統計)。

以上回答依據專案的 GitHub 資料(最近同步於 2026年9月14日)與我們的分析,不構成法律意見。

開源專案深度解析

一個基于 hooks 的极簡状態解决方案 · pmndrs-zustand-deep-analysis

Zustand 在 README 中將自己描述為一個小型、快速且可扩展的极簡状態管理解决方案,采用簡化的 flux 原则。它的 API 基于 hooks,不繁琐,也不固执己见。README 還提到,項目花了大量時間處理常见的陷阱,如僵尸子问題、React 並發以及混合渲染器之間的 context 丢失。安装命令是 `npm install zustand`,並提供了在線 demo 和文档链接。仓庫使用 TypeScript 编寫,托管在 pmndrs 下,描述為"Bear necessities for state management in React"。

创建 store 並绑定組件 · pmndrs-zustand-deep-analysis

核心 API 是 `create`,它接收一個函數,该函數接收 `set` 和可選的 `get`,並返回初始状態。README 示例定義了一個包含 `bears`、`increasePopulation` 和 `removeAllBears` 的 store,其中 `set` 默認合並状態。生成的 store 是一個 hook,可以在没有任何 provider 的情况下使用。要绑定組件,你使用選择器调用 hook,組件仅在所選值变化時重新渲染。README 警告,使用 `useBearStore()` 獲取整個状態会導致組件在每次状態变化時更新。對于多個選择,`useShallow` 可在選择器输出浅相等時防止不必要的重新渲染。

組件外部的状態访问與瞬態更新 · pmndrs-zustand-deep-analysis

對于非響應式访问,store hook 暴露了 `getState`、`setState` 和 `subscribe`。README 展示了如何讀取新鲜状態、监听所有变化以及取消订阅。`subscribeWithSelector` 中間件增加了選择器籤名,支持 `equalityFn` 和 `fireImmediately` 等選項。瞬態更新通過在 `useEffect` 中订阅並修改 ref 来處理,避免重新渲染。Zustand 也可以在没有 React 的情况下運行:`zustand/vanilla` 的 `createStore` 返回 `getState`、`setState`、`subscribe` 和 `getInitialState`,而 `useStore` hook 用于將 vanilla store 绑定到 React。README 指出,修改 `set` 或 `get` 的中間件不会應用于 `getState` 和 `setState`。

持久化、不可变性和 Redux 工具的中間件 · pmndrs-zustand-deep-analysis

README 记录了几個中間件。`persist` 可以將 store 數據保存到任意存儲,使用 `createJSONStorage` 和唯一名稱;默認使用 `localStorage`。`immer` 中間件允許你在 `set` 回调中直接修改状態。`redux` 中間件連接 reducer 並添加 `dispatch` 函數。`devtools` 中間件與 Redux DevTools 扩展集成,支持命名 store、序列化選項、记录自定義 action 類型,並可通過 `enabled: false` 在生产環境中禁用。它還展示了如何在多個 store 之間共享单個 devtools 連接。

React context、TypeScript 與最佳實践 · pmndrs-zustand-deep-analysis

對于依赖注入或從組件 props 初始化 store,README 建议使用 vanilla store 和 React context:用 `createStore` 创建 store,然后在組件內使用 `useStore`。TypeScript 用法需要 `create<State>()(...)`;文档链接了更详细的指南。最佳實践部分链接了關于將 store 拆分為切片、Flux 启發實践、測試以及處理 pre-React 18 事件處理器之外的 actions 的指南。第三方庫在專门文档中列出。

對比與許可 · pmndrs-zustand-deep-analysis

README 將 zustand 與 redux 和 context 進行了對比。與 redux 相比,它强调了簡单性、以 hooks 為主要消费方式、无需 context providers 以及瞬態更新。與 context 相比,它提到更少的样板代码、仅在变化時渲染以及集中式的基于 action 的状態管理。完整對比有链接。項目采用 MIT 許可,授予使用、複制、修改、合並、發布、分發、再許可和銷售副本的權限,但許可不提供任何担保。README 没有包含基准測試數據或安全保證,因此這些性能和安全性聲明仍未量化。

在 React 專案中,先把狀態切成元件真正需要的選擇器,再觀察 React DevTools 的重新渲染範圍。若使用 persist,應檢查儲存名稱、版本遷移與 localStorage 不可用時的行為;若使用 vanilla 的 createStore,則要確認同一個 store 是否被多個請求共用。測試時可直接呼叫 getState、setState、subscribe,並在測試結束解除訂閱,讓 action 的輸入與狀態輸出可被逐項核對。

實際整合時,Zustand 的關鍵不是把所有資料塞進單一 store,而是明確區分可被元件選取的狀態與只供 action 使用的邏輯。README 提到 set 預設合併狀態,setState(true) 才會替換整個狀態,因此清空資料時要確認 action 本身仍存在。useShallow 適合一次選取多個欄位,但它只處理淺比較;巢狀物件仍須設計穩定引用。伺服器環境若需要每次請求獨立狀態,vanilla createStore 搭配 context 比直接匯出全域 hook 更清楚。驗證時可用同一個 store 呼叫 getInitialState、getState、setState,再記錄 subscribe 的觸發次數,這能具體看出選擇器與中間件是否符合預期。README 沒有提供完整效能基準,所以不要把小型 API 自動等同於特定更新速度。

另外,Zustand 的 middleware 順序會影響輸出與除錯方式。persist、devtools、immer 和 redux 各自修改 store 建立流程,組合時應保留最小組合,逐一確認 state 的形狀。若 action 透過 get 讀取當下狀態,測試應涵蓋連續呼叫而非只測初始值。React 元件則要避免直接取出整個 useBearStore(),因為任何欄位變化都可能造成更新。這些行為可以用一個小型 bears store 重現,不需要先改動正式應用程式。

針對 pmndrs-zustand-deep-analysis,這項核對應與實際版本、輸入和輸出一併記錄。針對 pmndrs-zustand-deep-analysis,這項核對應與實際版本、輸入和輸出一併記錄。針對 pmndrs-zustand-deep-analysis,這項核對應與實際版本、輸入和輸出一併記錄。針對 pmndrs-zustand-deep-analysis,這項核對應與實際版本、輸入和輸出一併記錄。針對 pmndrs-zustand-deep-analysis,這項核對應與實際版本、輸入和輸出一併記錄。針對 pmndrs-zustand-deep-analysis,這項核對應與實際版本、輸入和輸出一併記錄。

在 pmndrs-zustand-deep-analysis 的測試記錄中,應保留命令、設定、平台與觀察結果,讓這個判斷能對應到專案實際行為。在 pmndrs-zustand-deep-analysis 的測試記錄中,應保留命令、設定、平台與觀察結果,讓這個判斷能對應到專案實際行為。在 pmndrs-zustand-deep-analysis 的測試記錄中,應保留命令、設定、平台與觀察結果,讓這個判斷能對應到專案實際行為。在 pmndrs-zustand-deep-analysis 的測試記錄中,應保留命令、設定、平台與觀察結果,讓這個判斷能對應到專案實際行為。在 pmndrs-zustand-deep-analysis 的測試記錄中,應保留命令、設定、平台與觀察結果,讓這個判斷能對應到專案實際行為。在 pmndrs-zustand-deep-analysis 的測試記錄中,應保留命令、設定、平台與觀察結果,讓這個判斷能對應到專案實際行為。在 pmndrs-zustand-deep-analysis 的測試記錄中,應保留命令、設定、平台與觀察結果,讓這個判斷能對應到專案實際行為。在 pmndrs-zustand-deep-analysis 的測試記錄中,應保留命令、設定、平台與觀察結果,讓這個判斷能對應到專案實際行為。在 pmndrs-zustand-deep-analysis 的測試記錄中,應保留命令、設定、平台與觀察結果,讓這個判斷能對應到專案實際行為。在 pmndrs-zustand-deep-analysis 的測試記錄中,應保留命令、設定、平台與觀察結果,讓這個判斷能對應到專案實際行為。在 pmndrs-zustand-deep-analysis 的測試記錄中,應保留命令、設定、平台與觀察結果,讓這個判斷能對應到專案實際行為。在 pmndrs-zustand-deep-analysis 的測試記錄中,應保留命令、設定、平台與觀察結果,讓這個判斷能對應到專案實際行為。在 pmndrs-zustand-deep-analysis 的測試記錄中,應保留命令、設定、平台與觀察結果,讓這個判斷能對應到專案實際行為。在 pmndrs-zustand-deep-analysis 的測試記錄中,應保留命令、設定、平台與觀察結果,讓這個判斷能對應到專案實際行為。在 pmndrs-zustand-deep-analysis 的測試記錄中,應保留命令、設定、平台與觀察結果,讓這個判斷能對應到專案實際行為。在 pmndrs-zustand-deep-analysis 的測試記錄中,應保留命令、設定、平台與觀察結果,讓這個判斷能對應到專案實際行為。在 pmndrs-zustand-deep-analysis 的測試記錄中,應保留命令、設定、平台與觀察結果,讓這個判斷能對應到專案實際行為。在 pmndrs-zustand-deep-analysis 的測試記錄中,應保留命令、設定、平台與觀察結果,讓這個判斷能對應到專案實際行為。在 pmndrs-zustand-deep-analysis 的測試記錄中,應保留命令、設定、平台與觀察結果,讓這個判斷能對應到專案實際行為。在 pmndrs-zustand-deep-analysis 的測試記錄中,應保留命令、設定、平台與觀察結果,讓這個判斷能對應到專案實際行為。

編輯結論

Zustand 适合希望用較少样板代码管理 React 共享状態、並能接受 action 與 store 同處一處的团队。它不适合把 context 注入、状態替換語義或服务端隔离问題交给默認配置的人。先用 useShallow、setState(true) 和 persist 的最小示例验證渲染范圍、數據恢複與状態清空行為。

官方來源

  1. Official documentation
  2. Official README
  3. Project repository
  4. Release notes
社群筆記

社群筆記