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
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
130
DiscordBotをPythonからGoへリプレイスした話
maguroalternative
1
220
Golangのデータベーステストフィクスチャ作成
maguroalternative
0
430
Other Decks in Technology
See All in Technology
2026TECHFRESH畢業分享會 - AI 時代的人生存檔點
line_developers_tw
PRO
0
860
あなたの AI ワークスペースに、 専門コーダーを連れてくる - Amazon Quick Desktop 最新情報
kawaji_scratch
1
130
Android の公式 Skill / Android skills
yanzm
0
130
ACE-Step-1.5で見る 音楽生成AIのしくみと“破綻だけ直す”Retake機能の開発【zennfes spring 2026 登壇資料】
personabb
1
140
機械学習を「社会実装」するということ 2026年夏版 / Social Implementation of Machine Learning June 2026 Version
moepy_stats
4
1.6k
小さく始める AI 活用推進 ― 日経電子版 Web チームの事例/nikkei-tech-talk47
nikkei_engineer_recruiting
0
230
スキルと MCP ツール、責務をどう分けるか? AI が迷わないインターフェース設計の戦略
cdataj
1
970
手塩にかけりゃいいってもんじゃない
ming_ayami
0
470
【Cyber-sec+】経営層を"動かす"ための考え方
hssh2_bin
0
140
チームで進めるAI駆動アジャイル×ウォーターフォール
kumaiu
0
150
Socrates × Looker 〜セマンティックレイヤーで進化するデータ分析エージェント〜
hanon52_
3
2.2k
失敗を資産に変えるClaude Code
shinyasaita
0
530
Featured
See All Featured
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
240
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
270
Navigating Weather and Climate Data
rabernat
0
220
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Testing 201, or: Great Expectations
jmmastey
46
8.2k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.7k
Designing for humans not robots
tammielis
254
26k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
Code Review Best Practice
trishagee
74
20k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
160
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.6k
Marketing to machines
jonoalderson
1
5.4k
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で解決することもある。 - 基本的に副作用は最終手段として考えよう。 -
とはいえ判断が難しいなら使ってもいいと思う。 - 使っていくうちに副作用であるべきか否かがわかってくるはず。