Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
もう迷わない! useEffectEventでエフェクトイベント分離
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Izawa Ryosuke
February 02, 2026
580
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
もう迷わない! useEffectEventでエフェクトイベント分離
2026/1/23 React Tokyo #13
Izawa Ryosuke
February 02, 2026
Featured
See All Featured
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.4k
Building an army of robots
kneath
307
47k
Ethics towards AI in product and experience design
skipperchong
2
420
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.6k
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
840
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
930
How STYLIGHT went responsive
nonsquared
100
6.3k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
530
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
5
790
Unsuck your backbone
ammeep
672
58k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
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ではポスター発表をする予定です。 よければ、お越しいただけると幸いです