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
マグロ隊長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
450
React19.2のuseEffectEventを追う
maguroalternative
2
1.1k
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
Kubernetesにおける学習基盤とLLMOpsの概要
ry
1
320
不要なレビューをAIにまかせて AIコーディングの環境改善を加速した
shoota
1
230
Flow 不死:AI 時代 DevOps 的不變本質
cheng_wei_chen
2
350
AIチャット検索改善の3週間
kworkdev
PRO
2
140
Bucharest Tech Week 2026 - Reinventing testing practices in the AI era
edeandrea
PRO
1
170
サイバーエージェントにおけるAI推進戦略と変革への取り組み
shotatsuge
0
190
攻撃者視点で考えるDetection Engineering
cryptopeg
3
2k
ACE-Step-1.5で見る 音楽生成AIのしくみと“破綻だけ直す”Retake機能の開発【zennfes spring 2026 登壇資料】
personabb
1
540
2026 TECHFRESH 畢業分享會 - AI-Native 重塑軟體工程與虛擬講師
line_developers_tw
PRO
0
1.3k
2026TECHFRESH畢業分享會 - Lightning Talk - 打造精準高效的 MCP 設計模式與測試實務
line_developers_tw
PRO
0
1.3k
AWS Security Agent といっしょに脅威モデリングをやってみよう
amarelo_n24
1
180
2026TECHFRESH畢業分享會 - 葬送的通靈師:化系統與用戶雜訊成行動訊號
line_developers_tw
PRO
0
1.3k
Featured
See All Featured
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
340
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.5k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
600
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
25k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.2k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
950
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
How to train your dragon (web standard)
notwaldorf
97
6.7k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.2k
Into the Great Unknown - MozCon
thekraken
41
2.6k
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で解決することもある。 - 基本的に副作用は最終手段として考えよう。 -
とはいえ判断が難しいなら使ってもいいと思う。 - 使っていくうちに副作用であるべきか否かがわかってくるはず。