前回:フォーム入力を同期する!Controlled Components(制御コンポーネント)の仕組みでは、Reactがフォームのデータを完全に支配する方法を学びました。
これまでは「ユーザーがボタンを押した」などの**きっかけ(イベント)**に応じて画面を動かしてきましたが、アプリを作っていると「きっかけがなくても動いてほしい」場面に出会います。
- 画面が開いた瞬間に、サーバーからデータを取ってきたい(API連携)
- 1秒ごとにカウントを進めたい(タイマー)
- 画面のタイトルを書き換えたい
これらはReactの「見た目を作る」という本来の役割から少し外れた「おまけの仕事」であり、専門用語で**「副作用(Side Effect)」**と呼びます。この副作用を安全に管理するのが useEffect(ユー・エフェクト) です。
1. useEffectは「実行タイミング」の番人
Reactコンポーネントは、データが変わるたびに何度も「再レンダリング(描き直し)」されます。もし、描き直しのたびにAPI通信を行ってしまうと、サーバーに負荷がかかりすぎてアプリが止まってしまいます。
useEffect を使うと、**「この処理は画面が表示された最初の1回だけやってね」とか「このデータが変わったときだけ動いてね」**といった実行タイミングを、開発者がコントロールできるようになります。
2. 書き方の基本:2つの引数
useEffect は、2つのパーツで構成されます。
JavaScript
useEffect(() => {
// ① 実行したい処理(副作用)
}, [② 依存配列]);
- ① 実行したい処理:ここにAPI通信やタイマーのコードを書きます。
- ② 依存配列(重要!):ここに変数をいれると「その変数が変わったときだけ」実行されます。
[ ](空っぽ)の場合:画面が最初に表示された1回だけ実行されます。- 何も書かない場合:描き直しのたびに毎回実行されます(基本は使いません)。
3. 【実践】1秒ごとに進む「自動カウンター」
今回は、ユーザーが操作しなくても勝手に数字が増えていくタイマーを作ってみましょう。 第2回の環境で作成した App.jsx を書き換えてください。
App.jsx(最小構成版)
JavaScript
import React, { useState, useEffect } from 'react';
export default function App() {
const [count, setCount] = useState(0);
// useEffect の登場!
useEffect(() => {
// JavaScriptのポイント:setInterval(タイマー機能)
const timer = setInterval(() => {
setCount((prev) => prev + 1); // 1秒ごとに+1
}, 1000);
// 【重要】クリーンアップ関数
// コンポーネントが消える時にタイマーを止めないと、メモリリーク(故障)の原因になります
return () => clearInterval(timer);
}, []); // 空の配列なので「最初の1回だけ」タイマーをセットする
return (
<div style={{ textAlign: 'center', marginTop: '50px' }}>
<h1>自動カウンター(useEffect)</h1>
<p style={{ fontSize: '3rem' }}>{count}</p>
<p>※1秒ごとに勝手に増えていきます。</p>
</div>
);
}
CodeSandboxでuseEffectのタイマーを体験する
4. コードの解説(JavaScript & React)
JavaScriptのポイント
setInterval/clearInterval: 指定した時間(1000ミリ秒=1秒)ごとに処理を繰り返すJavaScriptの標準機能です。必ずclearIntervalで止めるセット運用が鉄則です。setCount((prev) => prev + 1): 更新用関数に「関数」を渡すと、今の最新の値(prev)を確実に使って計算できます。
Reactのポイント
- マウント(Mounting): 画面にコンポーネントが表示される瞬間のことです。
useEffectの第2引数が[]なら、このマウント時のみ実行されます。 - クリーンアップ(Cleanup):
return () => ...の部分は、そのコンポーネントが画面から消える直前に実行されます。「使い終わったタイマーを片付ける」ためのマナーです。
5. 2026年の学び:API通信とuseEffectの未来
2026年現在、単純なAPIデータ取得には React Query などの外部ライブラリを使うのが主流ですが、その土台にあるのは間違いなくこの useEffect です。
「特定のタイミングで、特定の処理を一回だけ行う」という感覚を身につけることが、Reactエンジニアとしての大きな一歩となります。
今回のまとめ
- useEffect は、画面の描き直しとは別の「副作用」を管理する。
- 第2引数の 依存配列 で、実行タイミングをコントロールする。
[](空配列) を渡せば、最初の1回だけ実行される。- タイマーなどは クリーンアップ関数 で必ず後片付けをする。
次回予告:無駄な動きをカットして高速化!
Reactはデータが変わるたびに画面を書き換えますが、アプリが大きくなると「本当は書き換えなくていい場所」まで動いて重くなることがあります。
次回、「第12回:Reactのレンダリング最適化:useMemoとuseCallbackで無駄な再描画を防ぐ」。 あなたのアプリを爆速にするための「賢いサボり方」を伝授します。お楽しみに!
本日の宿題: サンプルコードの useEffect の第2引数から [] を消すと、どうなるでしょうか?(※無限ループに注意!動作が重くなったらブラウザをリロードしてください)。なぜそうなるのか考えてみましょう!


コメント