状態管理

1. 状態(state)の管理方法

A. 単純な開閉フラグで管理するパターン

例tsxApply to page.tsxconst [isModalOpen, setIsModalOpen] = useState(false);<Dialog** _**open**_**={isModalOpen}** _**onOpenChange**_**={setIsModalOpen}>  {/* ... */}

特徴

  • 状態はtrue/falseのみ(開いているか閉じているか)
  • 副作用なし(開閉以外の処理は不要)
  • 用途:お知らせモーダル、単純な確認ダイアログなど

B. 選択データで管理するパターン

例tsxApply to page.tsxconst [selectedWork, setSelectedWork] = useState<WorkType | null>(null);<Dialog** _**open**_**={!!selectedWork}** _**onOpenChange**_**={(**_**open**_**) => !open && setSelectedWork(null)}>  {/* ... */}

特徴

  • 状態は「選択中のデータ」(nullなら閉じている、データがあれば開いている)
  • 副作用あり(閉じるときに選択データをリセット)
  • 用途:詳細表示モーダル、編集モーダル、動画再生モーダルなど

2. 副作用(side effect)の発生場所

A. onOpenChangeで副作用を発生させる

  • モーダルが閉じるタイミングで「選択データをリセット」などの処理を行う
  • 例:onOpenChange={(open) => !open && setSelectedWork(null)}

B. 開閉のみで副作用なし

  • モーダルの開閉だけを管理し、他の処理は不要
  • 例:onOpenChange={setIsModalOpen}

3. 状態管理の選択基準

| 管理方法 | 状態の内容 | 副作用の有無 | 適した用途 |

|------------------|--------------------|--------------|----------------------------------|

| フラグ(boolean)| 開閉のみ | なし | 単純なモーダル |

| データ(object) | 選択中のデータ | あり | 詳細・編集・動画再生などのモーダル|


4. 設計のポイント

  • 「開閉だけ」ならbooleanでOK。
  • 「何かのデータと連動」するなら、そのデータ自体をstateに持つ。
  • 閉じるときに「状態リセット」などの副作用が必要なら、onOpenChangeで処理を追加。
  • 状態管理の粒度は「再利用性」「拡張性」「シンプルさ」のバランスで決める。

5. まとめ

  • 状態管理と副作用の設計は、UIの使い勝手や保守性に直結します。
  • 今回のような違いを理解しておくことで、要件に応じた最適な実装が選べるようになります。
ブログ一覧に戻る