Upgrade to Pro — share decks privately, control downloads, hide ads and more …

バグを直したら useEffect が消えた

Avatar for taki taki
August 17, 2026

バグを直したら useEffect が消えた

2026-08-17 Ginza.js #11 での発表資料です。

AI でホームページを作るサービスのサイトエディタで、状態管理の失敗を2つして、2つとも同じ形で直した話をしました。

ざっくり説明すると、「履歴に入れない」「同時に1つだけ」といったルールを、毎回コードで気をつけて守るのをやめて、そもそも壊れない構造に変えた結果、useEffect が不要になりました、という内容です。

発表用の資料のため、口頭で補った部分はスライドに含まれていません。
特に次の3点は、資料だけでは伝わりにくいと思います。

- それぞれのコードが、実際にどう壊れていたか
- 「呼び忘れ」「消し忘れ」が具体的に何を指しているか
- 直したあとに気づいた、React 公式ドキュメントとの一致

参考にした公式ドキュメント
https://react.dev/learn/you-might-not-need-an-effect
https://react.dev/learn/sharing-state-between-components

Avatar for taki

taki

August 17, 2026

More Decks by taki

Other Decks in Programming

Transcript

  1. 前提 redo/undoが要件 - サイトの編集画⾯には redo/undo が必要 - Container というコンポーネントに useState

    が 15 個 → Zustand + zundo に移した - zundo = Zustand の履歴ミドルウェア 6
  2. 失敗1 2種類の状態を1つのストアで管理 サイトの中⾝ - ⾒出しの⽂字 - ⾊ - セクションの並び順 エディタの状態

    - 開いているタブ (テーマタブ, サイト設定タブ) - 選択中の要素 ユーザーが編集するデータ エディタ操作に必要なデータ undoで戻したい undoで戻したくない 8
  3. 解決 解決:2種類を2つのストアに分ける サイトの中⾝ エディタの状態 - ⾒出しの⽂字 - 開いているタブ - ⾊

    - 選択中の要素 - セクションの並び順 ユーザーが編集するデータ undoで戻したい エディタ操作に必要なデータ undoで戻したくない useContentStore useUIStore (履歴あり) (履歴なし) → pause で囲む必要がなくなり、 呼び忘れが起きない仕組みになった 10
  4. 答え合わせ 公式チュートリアルに同じ話がありました react.dev「Sharing State Between Components」 アコーディオンを⼀度に1つだけ開く例 - 各 Panel

    が isActive を持つ - 親が activeIndex を1つ持つ → 2つ同時に開く → 1つだけ開く https://react.dev/learn/sharing-state-between-components 17
  5. まとめ なぜ useEffect が消えたのか Effects are an escape hatch from

    the React paradigm. https://react.dev/learn/escape-hatches#you-might-not-need-an-effect - 消えた useEffect: React の中の state を、React の中の prop に合わせていた - 残っている useEffect: contenteditable や IME との同期(React の外) useEffect が悪いのではなく、使う場所が違った 19