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
AIチャット検索改善の3週間
kworkdev
PRO
2
140
2026TECHFRESH畢業分享會 - Lightning Talk - 資料也要 CI/CD? 用 Airbyte 自動化資料同步
line_developers_tw
PRO
0
1.3k
AI-DLCを “そのまま導入しなかった”話 ~組織に合わせてアジャストした 私たちの実践共有~
hiroramos4
PRO
0
230
【2026年版】 ベクトル検索とEmbedding最前線
mocobeta
20
5.4k
Android の公式 Skill / Android skills
yanzm
0
160
ロボティクスの技術 / Robotics Technology
ks91
PRO
0
110
脱SaaS!FDEを支えるプロビジョニングと分離設計
knih
0
240
LayerX コーポレートエンジニアリング室におけるサプライチェーンセキュリティへの取り組み / Supply Chain Security at LayerX Corporate Engineering
yuyatakeyama
2
690
2026TECHFRESH畢業分享會 - 葬送的通靈師:化系統與用戶雜訊成行動訊號
line_developers_tw
PRO
0
1.3k
Claude Codeをどのように キャッチアップしているか
oikon48
13
8.6k
AI駆動開発を通して感じた、 AI時代のデザイナーの役割変化
whisaiyo
4
2.3k
2026TECHFRESH畢業分享會 - AI 時代的人生存檔點
line_developers_tw
PRO
0
1.3k
Featured
See All Featured
Designing for Timeless Needs
cassininazir
1
260
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
440
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
1
200
My Coaching Mixtape
mlcsv
0
150
Measuring & Analyzing Core Web Vitals
bluesmoon
9
870
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
390
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
250
The Limits of Empathy - UXLibs8
cassininazir
1
360
Deep Space Network (abreviated)
tonyrice
0
210
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
55k
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で解決することもある。 - 基本的に副作用は最終手段として考えよう。 -
とはいえ判断が難しいなら使ってもいいと思う。 - 使っていくうちに副作用であるべきか否かがわかってくるはず。