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
useEffectってなんで非推奨みたいなこと言われてるの?
Search
マグロ隊長kinTV
November 30, 2025
Technology
8k
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
C#未経験の僕がAIに読めるコードを書かせるまで
maguroalternative
0
390
感動を貰う側から与える側へ -アイドルマスターミリオンライブから学ぶCfPに挑むと言うこと-
maguroalternative
1
580
React19.2のuseEffectEventを追う
maguroalternative
2
1.2k
UDDのススメ - 拡張版 -
maguroalternative
2
1.9k
遊戯王GX 丸藤兄弟から学ぶ成長
maguroalternative
1
220
UDDのすすめ
maguroalternative
0
1.5k
LINE Works Bot入門
maguroalternative
0
150
めぐろLT#21 今年一番の仕事の成果
maguroalternative
0
160
DiscordBotをPythonからGoへリプレイスした話
maguroalternative
1
230
Other Decks in Technology
See All in Technology
sue445's proposals 2026
sue445
0
120
Rustuna: Rustによる高速なOptuna実装
pfn
PRO
0
210
dbt Semantic Layerで進めるenechainのデータ民主化
akizhou
1
160
10年後、Engineering 行為を剥奪されるとして、わたしたちは、どう、何を創ればいいだろうか。 / If Engineering Is Taken Away in 10 Years, How and What Should We Create?
bitkey
PRO
1
220
価値について
gree_tech
PRO
0
140
会社紹介資料 / Sansan Company Profile
sansan33
PRO
31
430k
How to Design Configuration for Rails Applications
willnet
1
960
LLM-as-a-Judgeは本当に信頼できるのか――評価器を評価する話
taka_aki
2
950
スプシの手作業からの解脱 ~更新はClaude Codeに、見せ方と使い方はGASアプリに任せる~
kentarofujii
0
170
WasmをRustにする
sansantech
PRO
0
300
NDIでApple Vision Proにリアルタイム映像送信
jyouryuusui
0
140
会社説明資料
persolserverworks
0
9.8k
Featured
See All Featured
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.9k
Google's AI Overviews - The New Search
badams
0
1.6k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
33
5.3k
A Soul's Torment
seathinner
8
3.8k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
3.4k
Site-Speed That Sticks
csswizardry
13
1.6k
Paper Plane (Part 1)
katiecoart
PRO
2
12k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
940
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
440
Discover your Explorer Soul
emna__ayadi
2
1.3k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
69
67k
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で解決することもある。 - 基本的に副作用は最終手段として考えよう。 -
とはいえ判断が難しいなら使ってもいいと思う。 - 使っていくうちに副作用であるべきか否かがわかってくるはず。