先に要点
- Zustand は、React で共有状態をシンプルに持ちたいときに向く軽量な状態管理ライブラリです。
- Provider を必須にしない書き方で始めやすく、`useState` ではつらい共有状態をまとめやすいのが強みです。
- Context API より整理しやすく、Redux より軽く始めやすい場面があります。
- ただし、何でも 1 つの store に押し込むと逆に見通しが悪くなるので、役割ごとの分割は大事です。
React の状態管理って結局どれを選べばいいの? Zustand は簡単って聞くけど、何が楽なの? と迷う場面はかなり多いです。
特に、useState だけでは少し苦しいけれど、Redux ほど大きな仕組みはまだ要らない、というタイミングで Zustand が候補に上がりやすくなります。
この記事では、Zustand の基本、何が便利なのか、最初の使い方、Context API や Redux との違いまで、初心者向けに整理します。2026年4月時点で公式 README と公式ドキュメント、React 公式ドキュメント、Redux 公式ドキュメントを確認してまとめています。
Zustand とは何か
Zustand は、React で共有状態を扱うための軽量な状態管理ライブラリです。
公式 README では、small, fast and scalable な state management solution と説明されていて、Hook ベースで扱えるのが大きな特徴です。
初心者向けにざっくり言うと、複数のコンポーネントで使いたい状態を、外に出してまとめる仕組み です。
たとえば、こんな状態は useState だけだと持ち回りがだんだんつらくなります。
- ヘッダーとサイドバーの両方で使う開閉状態
- 一覧画面と検索フォームで共有するフィルター条件
- ログイン中ユーザーの軽い表示状態
- 複数の画面部品で参照する一時的な UI 状態
こうした 画面のあちこちで使う状態 を、store にまとめて扱いやすくするのが Zustand の役目です。
何が簡単なのか
Zustand がよく「簡単」と言われる理由は、最初のコード量がかなり少ないからです。
import { create } from 'zustand'
type CounterStore = {
count: number
increment: () => void
reset: () => void
}
export const useCounterStore = create<CounterStore>((set) => ({
count: 0,
increment: () => set((state) => ({ count: state.count + 1 })),
reset: () => set({ count: 0 }),
}))
使う側はこんな形です。
function Counter() {
const count = useCounterStore((state) => state.count)
const increment = useCounterStore((state) => state.increment)
return (
<div>
<p>{count}</p>
<button onClick={increment}>増やす</button>
</div>
)
}
このくらいの規模なら、store を作る -> 必要な値だけ取り出す でほぼ始められます。
初心者が楽に感じやすいポイントは次の通りです。
- Hook として読めるので React に馴染みやすい
- 小さい状態ならファイル 1 つで始められる
- Provider を用意しなくてもよい
- 共有状態の置き場がはっきりする
README でも Use the hook anywhere, no providers are needed. と案内されていて、ここが最初の心理的ハードルをかなり下げています。
useState とどう違うのか
useState は、まずコンポーネントの中に閉じた状態を持つための仕組みです。
そのため、単独のフォームや小さな部品では今でもいちばん自然です。
ただ、同じ状態を別の場所でも使いたくなると、次のような悩みが出やすくなります。
- props を何段階も渡す
- 共通の親へ状態を引き上げる
- どこが元の状態なのか見えにくくなる
Zustand は、そういう 1つのコンポーネントの中だけでは収まらない状態 に向いています。
逆に言うと、ローカルで完結する状態まで全部 Zustand に寄せる必要はありません。
実務でも、次のように分けると整理しやすいです。
| 状態の種類 | 向いている置き場 |
|---|---|
| 入力欄の一時値 | useState |
| モーダル開閉や共通フィルター | Zustand |
| アプリ全体のテーマや言語設定 | Context API か Zustand |
| 大きな業務アプリの統一された共有状態 | Redux 系も候補 |
Context API との違い
Context API は React 標準の仕組みで、深い階層まで値を渡したいときに便利です。
React 公式でも、props を何段階も渡すのがつらいときの選択肢として紹介されています。
ただし、React 公式は同時に Before you use context として、まず props や children で十分かも考えるよう案内しています。
つまり、Context は便利ですが、何でも入れればよいという話ではありません。
Zustand と Context API を並べると、違いはこんな感じです。
| 観点 | Context API | Zustand |
|---|---|---|
| 追加ライブラリ | 不要 | 必要 |
| 使い始めやすさ | React 標準で始めやすい | 軽量で始めやすい |
| 共有状態の整理 | 設計次第 | store に寄せやすい |
| 向いている場面 | テーマ、言語、軽い共有設定 | UI 状態、フィルター、複数部品で共有する状態 |
初心者向けにまとめると、単純な共有なら Context API、共有状態が増えてきたら Zustand も候補 と考えると分かりやすいです。
Redux との違い
Redux は、予測しやすく保守しやすいグローバル状態管理を目指した定番です。
ただし、今の Redux は Redux Toolkit 前提で考えるのが自然で、昔ながらの手書き Redux をそのまま比較対象にすると少しずれます。
Redux 公式でも、Redux ロジックを書くなら Redux Toolkit を使うことが強く推奨されています。
比較するとこうなります。
| 観点 | Zustand | Redux / Redux Toolkit |
|---|---|---|
| 最初のコード量 | 少なめ | やや多め |
| 学習コスト | 比較的軽い | 概念は少し多い |
| チームルールの統一 | ライブラリ側の縛りは弱い | 整えやすい |
| 大規模開発との相性 | 設計次第 | 強い |
なので、まずは軽く始めたい なら Zustand、大規模でルールを強くそろえたい なら Redux 系、という考え方が実務では分かりやすいです。
実務ではどんな場面で役に立つか
Zustand は、派手な大規模状態管理より、まず次のような場面で役に立ちやすいです。
1. 検索条件や並び順を画面内で共有したいとき
一覧、検索フォーム、件数表示、絞り込みタグが別コンポーネントに分かれていると、props の受け渡しが増えやすいです。
このとき store にまとめておくと、どこからでも同じ条件を読めます。
2. モーダルやサイドバーの UI 状態を共有したいとき
レイアウト部品と本文側の両方で開閉状態を触るような場面では、Zustand がかなり素直です。
3. 小〜中規模の React アプリで、Redux までは要らないとき
管理画面、社内ツール、ダッシュボードのように、共有状態はあるが、厳格な大規模運用までは不要 な場面と相性がよいです。
使うときの注意点
便利だからといって、何でも 1 つの store に集めると見通しが悪くなります。
初心者が最初に気をつけたいのは次の点です。
store を巨大化させない
認証、UI 状態、一覧条件、フォーム途中入力を全部 1 ファイルに入れると、あとで触りにくくなります。
役割ごとに分ける前提で考えた方が安全です。
必要な値だけ読む
store 全体をまとめて読みにいくと、不要な再描画の原因になります。
state => state.count のように、必要な値だけ取り出す意識はかなり大事です。
サーバー上の最新データと混同しない
Zustand は共有状態を持つのに向いていますが、外部 API から取るデータのキャッシュ専用ツールではありません。
画面の状態を持つのか、サーバー由来のデータを扱うのか は分けて考えた方が運用しやすいです。
初心者なら選んでよいか
結論として、React を少し触っていて、共有状態を楽にしたいならかなり選びやすい です。
特に向いているのは次のような人です。
useStateだけではつらくなってきた- Context API だと設計が散らかりそうだと感じる
- Redux より軽い選択肢から始めたい
逆に、チームで Redux に統一されているなら、その流れに合わせた方がよい場面もあります。
技術選定は「ライブラリ単体の良さ」だけでなく、既存コードやチームの慣れも大きいです。
まとめ
Zustand は、React で共有状態をシンプルに持ちたいときに向く軽量な状態管理ライブラリです。
Context API より状態の置き場を整理しやすく、Redux より軽く始めやすいのが魅力です。
ただし、何でも Zustand に寄せれば正解という話ではありません。
ローカル状態は useState、軽い共有は Context API も候補、大規模で厳格な管理は Redux 系 といった使い分けまで含めて考えると、かなり迷いにくくなります。
React を土台にした設計の違いをもう少し広く見たい場合は、Next.jsは他のフレームワークと何が違う?|React単体・Nuxt・バックエンド系との比較で整理 もあわせて読むとつながりやすいです。
参考リンク
- Zustand 公式 README: https://github.com/pmndrs/zustand
- Zustand 公式ドキュメント: https://zustand.docs.pmnd.rs
- React 公式ドキュメント(Context): https://react.dev/learn/passing-data-deeply-with-context
- Redux 公式ドキュメント: https://redux.js.org
- Redux Toolkit 公式ドキュメント: https://redux.js.org/introduction/why-rtk-is-redux-today