Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
もう迷わない! useEffectEventでエフェクトイベント分離
Search
Izawa Ryosuke
February 02, 2026
0
3
もう迷わない! useEffectEventでエフェクトイベント分離
2026/1/23 React Tokyo #13
Izawa Ryosuke
February 02, 2026
Tweet
Share
Featured
See All Featured
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
400
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
89
Skip the Path - Find Your Career Trail
mkilby
0
52
A Soul's Torment
seathinner
5
2.2k
Abbi's Birthday
coloredviolet
1
4.7k
Code Reviewing Like a Champion
maltzj
527
40k
New Earth Scene 8
popppiees
1
1.5k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.2k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
240
Design in an AI World
tapps
0
140
What’s in a name? Adding method to the madness
productmarketing
PRO
24
3.9k
Transcript
もう迷わない! useEffectEventでエフェクトイベント分離 伊澤 遼介 2026/1/23 React Tokyo #13
React Tokyo フェス 2026でポスター発表します!! チームで楽しく事業貢献したいエンジニア! フロントエンドバックエンド問わず ‧React、Next.js、Go 伊澤 遼介 Izawa
Ryosuke 趣味 ‧ランニング、サッカー、メジャーリーグ ‧Chrome拡張機能開発、エディタ拡張機能開発 (とにかく楽しく開発したい)
QRコードからカジュアル⾯談の 案内ページに⾶べます!🚀 「挑戦し、変化し、リードする仲間」を募集中 カジュアル⾯談も実施しています! 興味がある⽅、ぜひ⼀度お話しましょう🙌 3
2022年にuseEventとしてRFCされ、 3年の時を超えて正式リリース👏 React Conf 2025 React19.2で正式リリースされたuseEffectEvent
React Conf 2025のハイライトを書きました!! React TokyoのZenn記事に React Conf 2025 ハイライトの記事を書いたのでよければご覧ください 👀
useEffectEventってどんな機能?? エフェクト内で最新の値を使いたいけど、 その値が変わった時に Effectを再実行したくない時に使える Hook (エフェクトから非リアクティブなロジックを、エフェクトイベントに分離できる!)
useEffectEventが出る前に遭遇したこと(モヤモヤ) themeを依存配列に加えると、 Dark Themeに変えた時に再レンダリングが起こり、roomが再接続される 👈roomIdが変わっ た時に、最新の themeで通知を出し たい。 👈でもthemeが変 わった時に再実⾏し
たくない。
解決策1:themeを依存配列から外して、Lintを無効化する themeを依存配列から外すことはできたが Lintを無効化したことで今後のバグが⼼配。
解決策2:useRefを使う うまくできた感。とこれでいいのか感は残る
解決策3:useEffectEventを使う(19.2から使える✨) ・エフェクトから非リアクティブなロジックをエフェクトイベントに分離 ・依存配列から外せる 👈showNotificationを useEffectから分離できて いる
c あくまで、エフェクトから発⽕するイベントの時に使う。 ⚠ 注意点1:使い所に気をつける 詳しくは👇 エフェクトからイベントを分離する - React https://ja.react.dev/learn/separating-events-from-effects#extracting-non-reactive-logic-out-of-effects ※Linterのエラーを黙らせるためだけに使わない
⚠ 注意点2:イベントハンドラとエフェクトの違いをおさえる 詳しくは👇 エフェクトからイベントを分離する - React https://ja.react.dev/learn/separating-events-from-effects#extracting-non-reactive-logic-out-of-effects ‧イベントハンドラ:ユーザーの操作に反応したい ‧エフェクト:外部システムと同期したい ‧エフェクトイベント:エフェクト内で最新の値を使いたいが、再実⾏したくない
ここからは時間があれば (もしかしたら駆け⾜になるかもしれません)
・state/propsが変わる Reactの3つのフェーズ ・コンポーネント関数を実行 ・DOM更新、useEffect実行 ご興味のある⽅はこちらから👇 https://ja.react.dev/learn/render-and-commit
useEffectEventの実装を覗く👀 packages/react/src/ReactHooks.jsから始まる resolveDispatcher()でdispatcherを取得して callbackを受け取ってdispatcherに渡している (ここまではhooksでよくある流れ) ご興味のある⽅はこちらから👇 https://github.com/facebook/react
dispatcherはコンテキストに応じて変わる resolveDispatcherでdispatcherに ReactSharedInternals.Hをセット renderWithHooksで ReactSharedInternals.Hに HooksDispatcherOnMounttか HooksDispatcherOnUpdateをセット ※renderWithHooksはコンポーネント関数が呼ばれる前に必ず 呼ばれる(レンダーの段階) 最終的に、
dispatcherには 初回レンダリングの時は HooksDispatcherOnMount 再レンダリングの時は HooksDispatcherOnUpdate がセットされる。 resolveDispatcher()
dispatcherのuseEffectEventプロパティには ・HooksDispatcherOnMountの場合は mountEvent ・HooksDispatcherOnUpdateの場合は updateEvent がセットされる。 dispatcher.useEffectEventプロパティ 前のスライドで dispatcherは HooksDispatcherOnMountか
HooksDispatcherOnUpdateであることがわかった
updateEvent ・hookからrefを取り出す ・新しい callbackをキューに追加 ・eventFn を返す ※commitフェーズで ref.impl が最新に更新される mountEvent
・{impl: callback} のrefオブジェクトを作成 ・hookに保存 ・eventFnを返す mountEvent、updateEvent
・roomIdが変わって再レ ンダリングが発生する Reactの3つのフェーズ ・コンポーネント関数を実行 ・mountEvent/updateEventが呼 ばれる ・ref.implの更新が予約される (キューに追加) ・ref.implが更新される (useEffectEventの中の値が最新に)
・DOMを更新する ・useEffectのコールバックを実行 ご興味のある⽅はこちらから👇 https://ja.react.dev/learn/render-and-commit
commitRoot( ‧commitBeforeMutationEffects👈 ref.impl更新 ‧flushMutationEffects 👈DOM更新 ‧flushLayoutEffects 👈useLayoutEffect ‧flushPassiveEffects 👈 useEffect
※⼀部省略 ) コミットフェーズでref.implを更新 Reactのコミットフェーズ 👉 ref.implはuseEffectより先に更新されるから、 依存配列に⼊れなくても最新の値が使える!
まとめ React内部の実装を覗くことにより 新しい発見があり、とても勉強になりました。 React Tokyo Fes 2026ではポスター発表をする予定です。 よければ、お越しいただけると幸いです