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
useEffectってなんで非推奨みたいなこと言われてるの?
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
マグロ隊長kinTV
November 30, 2025
Technology
7.7k
11
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
useEffectってなんで非推奨みたいなこと言われてるの?
フロントエンドカンファレンス関西2025の登壇資料です。
https://fortee.jp/fec-kansai-2025
マグロ隊長kinTV
November 30, 2025
More Decks by マグロ隊長kinTV
See All by マグロ隊長kinTV
感動を貰う側から与える側へ -アイドルマスターミリオンライブから学ぶCfPに挑むと言うこと-
maguroalternative
1
460
React19.2のuseEffectEventを追う
maguroalternative
2
1.2k
UDDのススメ - 拡張版 -
maguroalternative
2
1.6k
遊戯王GX 丸藤兄弟から学ぶ成長
maguroalternative
1
170
UDDのすすめ
maguroalternative
0
1.4k
LINE Works Bot入門
maguroalternative
0
130
めぐろLT#21 今年一番の仕事の成果
maguroalternative
0
140
DiscordBotをPythonからGoへリプレイスした話
maguroalternative
1
220
Golangのデータベーステストフィクスチャ作成
maguroalternative
0
430
Other Decks in Technology
See All in Technology
小さいから、全部わかる。— 常駐AI "xangi" のすすめ
sugupoko
0
250
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
11k
「ちゃんとやっている」は独りよがりだった ― 不安に寄り添うインシデント対応へ / Towards incident response that addresses anxieties
chmikata
1
360
【FinOps】データドリブンな意思決定を目指して
z63d
3
600
事業価値を⽣み出すSREへ SREが担うべき意思決定の5層
kenta_hi
0
140
背中から、背中へ /paying forward to community
naitosatoshi
0
220
組織における AI-DLC 実践
askul
0
300
金融の未来を考える / Thinking About the Future of Finance
ks91
PRO
0
150
なぜ私たちのSREプラクティスはなかなか機能しないのか 〜システムより先に組織を見る〜 / Why our SRE practices aren't really working
vtryo
0
170
NDIAS CTF 2026 問題解説会資料
bata_24
0
170
『AIに負けない』より『AIと遊ぶ』」〜ワクワクが最強のテスト・QA学習戦略_公開用
odan611
1
370
LiDAR SLAMの実装とセンサ融合 ~Lie群からContinuous-Time LIOまで~
naokiakai
1
940
Featured
See All Featured
Tell your own story through comics
letsgokoyo
1
980
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
How to Ace a Technical Interview
jacobian
281
24k
GraphQLとの向き合い方2022年版
quramy
50
15k
Balancing Empowerment & Direction
lara
6
1.2k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
300
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
380
Un-Boring Meetings
codingconduct
0
330
How GitHub (no longer) Works
holman
316
150k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
Transcript
useEffectってなんで非推奨みた いなこと言われてるの? フロントエンドカンファレンス関西2025 マグロ/佐々木陽貴
目次 - useEffectって使わない方がいい? - useEffectとは - 非推奨とされる使い方 - 使うべき場面 -
エフェクトなしでも行ける場面 - まとめ
自己紹介 名前:マグロ 本名:佐々木陽貴(sasaki haruki) 所属:株式会社くふうカンパニー(24卒サーバーサイド) コメント:7年ぶりの関西でワクワク&今回CfP形式のテックカン ファレンス初登壇となります。お手柔らかにお願いします!
useEffectって使わないほうがいい? 定期的にSNSや記事に上がってくる「useEffect」使うな。 これなんで言われてるかわかります? なんか知らんけど使わな い方がいいらしいよ そうなんですか??? せんぱい おれ 去年のやりとり
useEffectって使わないほうがいい? 定期的にSNSや記事に上がってくる「useEffect」使うな。 これなんで言われてるかわかります? useEffectの役割について振り返りましょう。 おれ まあちゃんと知っておこうか
useEffectとは コンポーネントを外部システムと同期するためのHooks。
useEffectとは コンポーネントを外部システムと同期するためのHooks。 useEffect(setup, dependencies?) setup: エフェクトのロジックを記述 dependencies: 依存配列。この値が更新されるとsetupが実行される。(省略可) なし:レンダリングごとに実行 空配列:初回レンダリングのみ
useEffectとは コンポーネントを外部システムと同期するためのHooks。 外部システムの例 - DOM(仮想DOMじゃない実要素) - イベントリスナーやブラウザ API - ネットワーク通信(API
/ WebSocket) - ブラウザのストレージ(localStorage, sessionStorage) - タイマー・スケジューラ - 外部ライブラリ(非 React ベース)
非推奨とされる使い方 この外部イベントに対して使用するべきで、それ以外の用途は推奨されない。
非推奨とされる使い方 この外部イベントに対して使用するべきで、それ以外の用途は推奨されない。 例:propsやstateが更新されたらstateを更新 function Form() { const [firstName, setFirstName] =
useState(’Taylor’); const [lastName, setLastName] = useState(’Swift’); const [fullName, setFullName] = useState(’’); useEffect(() => { setFullName(firstName + ’ ’ + lastName); }, [firstName, lastName]); … } function Form() { const [firstName, setFirstName] = useState(’Taylor’)'; const [lastName, setLastName] = useState(’Swift’); const fullName = firstName + ’ ’ + lastName; … } ダメな例 いい例 React公式ドキュメント「そのエフェクトは不要かも」より
非推奨とされる使い方 この外部イベントに対して使用するべきで、それ以外の用途は推奨されない。 例:propsやstateが更新されたらstateを更新 function Form() { const [firstName, setFirstName] =
useState(’Taylor’); const [lastName, setLastName] = useState(’Swift’); const [fullName, setFullName] = useState(’’); useEffect(() => { setFullName(firstName + ’ ’ + lastName); }, [firstName, lastName]); … } function Form() { const [firstName, setFirstName] = useState(’Taylor’)'; const [lastName, setLastName] = useState(’Swift’); const fullName = firstName + ’ ’ + lastName; … } stateやpropsが更新された時 点で処理は再び走るので、わ ざわざエフェクトとして定義し なくていい いい例 ダメな例 React公式ドキュメント「そのエフェクトは不要かも」より
使うべき場面 イベントハンドラや実DOMを使う 例:他の要素をクリックすると閉じるモーダル
export default function Modal({ isOpen, onClose }) { // modal本体
const modalRef = useRef(null); useEffect(() => { if (!isOpen) return; const handleClickOutside = (e) => { // modalRef の中に含まれていない要素をクリックしたら閉じる if (modalRef.current && !modalRef.current.contains(e.target)) { onClose(); } }; // クリックイベントを window に張る window.addEventListener("mousedown", handleClickOutside); // クリーンアップ return () => { window.removeEventListener("mousedown", handleClickOutside); }; }, [isOpen, onClose]); if (!isOpen) return null; ... }
export default function Modal({ isOpen, onClose }) { // modal本体
const modalRef = useRef(null); useEffect(() => { if (!isOpen) return; const handleClickOutside = (e) => { // modalRef の中に含まれていない要素をクリックしたら閉じる if (modalRef.current && !modalRef.current.contains(e.target)) { onClose(); } }; // クリックイベントを window に張る window.addEventListener("mousedown", handleClickOutside); // クリーンアップ return () => { window.removeEventListener("mousedown", handleClickOutside); }; }, [isOpen, onClose]); if (!isOpen) return null; ... } 実要素のDOMをイベントハンドラで 取得するためReactの管轄外になる =useEffectを使う点で適している
使うべき場面 データフェッチ 例:日付絞り込みの範囲が変わるとフェッチをする
const [posts, setPosts] = useState([]); const [startDate, setStartDate] = useState("");
const [endDate, setEndDate] = useState(""); useEffect(() => { if (!startDate || !endDate) return; const controller = new AborController(); const signal = controller.signal; const fetchPosts = async () => { try { const params = new URLSearchParams({ startDate, endDate, }).toString(); const res = await fetch(`https://api.example.com/posts?${params}`, { signal }); const data = await res.json(); setPosts(data); } catch (error) { console.error("投稿取得エラー:", error); } }; fetchPosts(); return () => { controller.abort() }; }, [startDate, endDate]); // 日付が変わると自動で再取得
const [posts, setPosts] = useState([]); const [startDate, setStartDate] = useState("");
const [endDate, setEndDate] = useState(""); useEffect(() => { if (!startDate || !endDate) return; const controller = new AborController(); const signal = controller.signal; const fetchPosts = async () => { try { const params = new URLSearchParams({ startDate, endDate, }).toString(); const res = await fetch(`https://api.example.com/posts?${params}`, { signal }); const data = await res.json(); setPosts(data); } catch (error) { console.error("投稿取得エラー:", error); } }; fetchPosts(); return () => { controller.abort() }; }, [startDate, endDate]); // 日付が変わると自動で再取得 日付が変わると自動で再取得 絞り込みの期間を管理 フェッチした投稿をセット stateが更新されたので再レンダリン グ =APIから取得したデータをコンポー ネントと同期する
エフェクトなしでも行ける場面 じゃあ別に非推奨要素なくない?? ガッツリ使う要素あるやん
エフェクトなしでも行ける場面 じゃあ別に非推奨要素なくない?? →はい ですが使わなくて済む場面が増えています。 まじすか
エフェクトなしでも行ける場面 使わない方がいい? ものによるけど、使わなくていいならそれでいい。
エフェクトなしでも行ける場面 使わない方がいい? ものによるけど、使わなくていいならそれでいい。 例えば - 外部システムを自分で管理しないといけない - 処理が複雑だと、可読性が落ちる - クリーンアップ忘れてメモリリーク
→管理が大変でバグの元になることも 管理大変なuseEffectの例
エフェクトなしでも行ける場面 モーダル UIライブラリに要件を満たせるものが結構あるので代替えできるのであればそれにする と良い shadcnのDialogとかほぼそれ
エフェクトなしでも行ける場面 データフェッチ RSCの登場でサーバー側でフェッチすることが多い クライアント側でフェッチする場合もReactQueryやSWRといった外部ライブラリでフェッ チできるケースも増加
import { useState } from "react"; import { useQuery }
from "@tanstack/react-query"; async function fetchPosts({ queryKey }) { const [_key, { startDate, endDate }] = queryKey; const params = new URLSearchParams({ startDate, endDate }).toString(); const res = await fetch(`https://api.example.com/posts?${params}`); return res.json(); } export default function Posts() { const [startDate, setStartDate] = useState(""); const [endDate, setEndDate] = useState(""); // ⭐ React Query が自動でフェッチ & リフェッチしてくれる const { data, isLoading, error } = useQuery({ queryKey: ["posts", { startDate, endDate }], queryFn: fetchPosts, enabled: Boolean(startDate && endDate), // 両方入力されたときだけ実行 }); ... } データフェッチを全て ReactQueryが 管理してくれるためエフェクトどころ かstateも不要
エフェクトなしでも行ける場面 外部ストアのサブスクライブ 例:ブラウザの幅が変更された際 背景アニメーションが画面幅に依存するケース
import { useSyncExternalStore } from "react"; let cachedSnapshot = {
width: 0, height: 0 }; const cachedServerSnapshot = { width: 0, height: 0 }; function resizeSubscribe(callback: () => void) { window.addEventListener("resize", callback); return () => window.removeEventListener("resize", callback); } function useWindowSize() { const getSnapshot = () => { const width = window.innerWidth; const height = window.innerHeight; if (cachedSnapshot.width !== width || cachedSnapshot.height !== height) { cachedSnapshot = { width, height }; } return cachedSnapshot; }; const getServerSnapshot = () => { return cachedServerSnapshot; }; return useSyncExternalStore(resizeSubscribe, getSnapshot, getServerSnapshot); } export default function Home(){ const { width, height } = useWindowSize(); ... } 幅が変わったらwidth,heightの値も 合わせて更新される また値が変わるとレンダリングが走 る useSyncExternalStoreで幅を管理 監視するイベント (今回は画面幅)
うーん 難しいね!!!
まとめ - useEffectは外部システムとReactの橋渡しをするもので、非推奨ではない。 - それ以外の用途であれば基本使わずに表現できる。 - 本来使うべきところでもライブラリや他のHooksで解決することもある。 - 基本的に副作用は最終手段として考えよう。 -
とはいえ判断が難しいなら使ってもいいと思う。 - 使っていくうちに副作用であるべきか否かがわかってくるはず。