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

なぜuseEffectは悪者扱いされるのか 〜 useEffectを作ってみて〜

Avatar for iWonder118 iWonder118
October 02, 2026
53

なぜuseEffectは悪者扱いされるのか 〜 useEffectを作ってみて〜

Avatar for iWonder118

iWonder118

October 02, 2026

Transcript

  1. これをやろうと思った背景 作るものの仕様 - TypeScriptで1ファイルかつ、 100行ほど 300行ほどになってきました - JSXから最終的に DOM操作で画面が更新されるまで (CSR)

    - HooksはuseState、useEffect(new!)のみ - Fiberを簡略化 - 双方向リンクノードでなく、配列にて保持かつ、一気に描画処理 - className・onClickのみ対応
  2. React の描画をおさらい JSXから描画されるまで - Trigger - 初回レンダリングまたは、setter(useState)からイベント発火 - Render -

    コンポーネントをjsxからReactElementへの変換 - ReactElementからReactFiberへの変換 - Commit - ReactFiberから実際のDOM操作
  3. 各セクションのお話 JSX - tsconfig.jsonで指定 - jsxの設定としてをreact-jsx - jsxIportSourceをnano-reactに設定 - 開発モードのJSXコンパイラが

    jsxImportSourceからjsxDEV という名前の関数を自動importする コードを生成する仕様になっている
  4. useEffectのお話 useEffectとは - コンポーネントを外部システムと同期させるための React フック - API呼び出しや、ブラウザ固有の操作(localstorage、クエリパラメータな ど)の副作用を切り出す -

    useEffectのお陰でコンポーネントの純粋性が保てる - setup関数と依存配列とsetup関数内で関数をreturnすることでcleanup 関数 - あればcleanup関数->前回と今回の依存配列比較->setup関数実行
  5. useEffectのお話 useEffectが描画とどう絡むのか - 初回描画 - Commit完了後にsetup関数を実行する - setup関数の中にtriggerとなるものがあれば再描画が走る - 再描画

    - 依存配列の値を用いて描画後にsetup関数を実行する - 前回の描画の値を保持しているので、その値と比較し、差分があれば setup関数を実行する - 描画自体はuseEffectの担当ではない 。あくまで関数内のsetter
  6. useEffectのお話 useEffectがなぜ悪者扱いされるのか - 副作用の塊だから - 副作用は命令的であるがゆえに確定出来ない - 宣言的UIのレンダリングの邪魔 - レンダリングが

    2回動くきっかけになる - useEffectのsetup関数から値保存でTrigger(setter)を呼ぶことで、もう一 度Trigger・Render・Commitが動き、再レンダリング