状態管理

フロントエンドアプリケーションのデータの流れと状態の変更を一元的に管理する手法

フロントエンドReact

状態管理とは

状態管理 (State Management) は、フロントエンドアプリケーションの UI の状態 (ユーザー入力、API レスポンス、表示/非表示) を一元的に管理する手法である。コンポーネント間でデータを共有し、状態の変更を予測可能にする。

状態の種類

状態の種類を以下にまとめる。

種類管理方法
ローカル状態フォーム入力、モーダルの開閉useState
グローバル状態ログインユーザー、テーマContext, Zustand
サーバー状態API レスポンス、キャッシュTanStack Query
URL 状態ページ、フィルター、ソートURL パラメータ

React の状態管理ツール

React の状態管理ツールを以下に示す。

ツール特徴適するケース
useStateReact 組み込みローカル状態
useContextReact 組み込み、プロップドリリング解消テーマ、認証
Zustand軽量、シンプル API中規模アプリ
Jotaiアトミック、ボトムアップ細粒度の状態管理
Redux Toolkit大規模、DevTools大規模アプリ
TanStack Queryサーバー状態専用API キャッシュ

useState (ローカル状態)

useState (ローカル状態) のコード例を示す。

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

Zustand (グローバル状態)

Zustand (グローバル状態) のコード例を示す。

import { create } from 'zustand';

const useStore = create<{ user: User | null; login: (u: User) => void }>((set) => ({
  user: null,
  login: (user) => set({ user }),
}));

// コンポーネントで使用
function Header() {
  const user = useStore(state => state.user);
  return <div>{user?.name ?? 'Guest'}</div>;
}

TanStack Query (サーバー状態)

TanStack Query (サーバー状態) のコード例を示す。

function UserList() {
  const { data, isLoading } = useQuery({
    queryKey: ['users'],
    queryFn: () => fetch('/api/users').then(r => r.json()),
    staleTime: 5 * 60 * 1000, // 5分間キャッシュ
  });

  if (isLoading) return <div>Loading...</div>;
  return <ul>{data.map(u => <li key={u.id}>{u.name}</li>)}</ul>;
}

TanStack Query はサーバー状態のキャッシュ、再取得、楽観的更新を自動化する。API レスポンスを Zustand や Redux で管理する必要がなくなる。

選択基準

選択基準を図で示す。

ローカル状態 → useState
  ↓ 複数コンポーネントで共有
グローバル状態 → Zustand (シンプル) or Redux (大規模)
  ↓ API レスポンスのキャッシュ
サーバー状態 → TanStack Query

より深く学ぶには関連書籍が役立つ。

この記事は役に立ちましたか?

関連用語

関連する記事