1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Reactの便利なuseEffectついて

Posted at

useEffectとは?

  • 副作用(状態保持以外の処理)を行うフックです

どのようなことができるか?

初回マウント時の処理を書くことができる

useEffect(() => {
  console.log("初回だけ実行");
}, []);

値が変わったときの処理を書ける

useEffect(() => {
  console.log(`countが変化: ${count}`);
}, [count]);

外部リソースとのやり取り

APIフェッチ、WebSocket、外部ライブラリの初期化などができる

useEffect(() => {
  fetch("/api/data").then(res => res.json()).then(setData);
}, []);

環境やブラウザの操作

DOM操作、document.title 更新、localStorage 読み書きなど

useEffect(() => {
  document.title = `カウント: ${count}`;
}, [count]);

継続処理とクリーンアップ
タイマーやイベントリスナーを設定し、不要になったら解除できる

useEffect(() => {
  const id = setInterval(() => console.log("tick"), 1000);
  return () => clearInterval(id); // 後始末
}, []);

どうしてuseEffect内でその処理をするべきなのか?

React のレンダータイミングと合わせるため

  • React は レンダー(描画)処理 → その後に副作用処理 という流れを持っています。
  • もし関数コンポーネントの本体に直接 fetchdocument.title を書くと…
    • 毎回レンダーのたびに実行される
    • 無限ループの原因になりやすい
// ❌ 毎回レンダーで走ってしまう
const Comp = ({ count }) => {
  document.title = `カウント: ${count}`; 
  return <div>{count}</div>;
};

どうゆう時に有用か?

  • 初回だけ実行したい処理

    (例: コンポーネントが画面に出た瞬間に何かする)

  • 値が変化したタイミングで実行したい処理

    (例: 依存している状態やpropsが更新されたときに追加処理をしたい)

  • 外部とつながる処理

    (例: API呼び出し、WebSocket接続、外部ライブラリの初期化)

  • ブラウザや環境を操作する処理

    (例: document.title の変更、localStorage の読み書き、イベントリスナーの登録)

  • 継続的な処理の開始と終了を制御する処理

    (例: タイマー開始 → コンポーネントが消える時にタイマー解除)

  • リソースの後片付けが必要な処理

    (例: イベントリスナー削除、購読解除、接続終了など)

ここまで見ていただきありがとうございます!、もし間違いや不足があれば教えていただけると助かります!

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?