Tech Bytes

短くて分かりやすい技術情報を記事として共有します。みなさんにとって学びになれば幸いです。

ReactのuseEffectの処理内容と使う場面

useEffectとは何か

useEffectは、Reactフックの1つであり、コンポーネントのレンダリングサイクルの中で副作用を処理するために使用されます。
これは、API呼び出し、購読、タイマーのセットなどの非同期な操作を行う際に特に便利です。
useEffectは、コンポーネントがマウントされたとき、特定のプロパティが変更されたとき、またはコンポーネントがアンマウントされたときに実行されるコードを指定することができます。

useEffectの基本的な構文は以下の通りです:

import React, { useEffect } from 'react';

function MyComponent() {
  // useEffectの第1引数には副作用のコードが入ります
  useEffect(() => {
    // ここに副作用のコードを書く
    console.log('useEffectが実行されました');

    // クリーンアップ関数を返すことができます
    return () => {
      console.log('クリーンアップ関数が実行されました');
    };
  }, []); // 第2引数には監視対象の変数を指定します
  // 空の配列の場合、コンポーネントがマウントされたときに1回だけ実行されます

  // コンポーネントの描画など他のコードもここに含まれます

  return (
    <div>
      {/* コンポーネントの中身 */}
    </div>
  );
}

useEffectの第1引数には実行される副作用のコードが入ります。
第2引数は依存する変数のリストで、このリスト内の変数が変更されたときにuseEffectが再実行されます。
空の配列を指定すると、コンポーネントがマウントされたときに1回だけ実行され、アンマウント時にクリーンアップ関数が実行されます。

これにより、非同期な操作を行う際にリソースのリークを防ぎ、適切なタイミングで副作用を制御することができます。

useEffectを使う場面

useEffectはReactで非同期な操作や副作用を行う場面で非常に有用です。
以下は、useEffectを使用する一般的な場面です:

1. データの取得やAPI呼び出し:
ページがロードされたときや特定の状態が変化したときに、サーバーからデータを取得するためにuseEffectを使用できます。
これにより、非同期操作を実行し、取得したデータをコンポーネントの状態に設定できます。

useEffect(() => {
  const fetchData = async () => {
    try {
      const response = await fetch('https://api.example.com/data');
      const data = await response.json();
      setData(data);
    } catch (error) {
      console.error('Error fetching data:', error);
    }
  };

  fetchData();
}, []); // 空の配列はマウント時に1回だけ実行

2. イベントの購読や解除:
useEffectを使用してコンポーネントがマウントされたときにイベントを購読し、アンマウント時にイベントの購読を解除することができます。

useEffect(() => {
  const handleResize = () => {
    // ウィンドウのリサイズ時の処理
  };

  window.addEventListener('resize', handleResize);

  // クリーンアップ関数で購読解除
  return () => {
    window.removeEventListener('resize', handleResize);
  };
}, []); // 空の配列はマウント時に1回だけ実行

3. タイマーの設定やクリア:
useEffectを使用してタイマーを設定し、コンポーネントがアンマウントされたときにタイマーをクリアできます。

useEffect(() => {
  const timerId = setInterval(() => {
    // 定期的な処理
  }, 1000);

  // クリーンアップ関数でタイマーのクリア
  return () => {
    clearInterval(timerId);
  };
}, []); // 空の配列はマウント時に1回だけ実行

4. 外部ライブラリの初期化:
外部ライブラリやリソースの初期化や解放をuseEffect内で行うことができます。

useEffect(() => {
  // 外部ライブラリの初期化

  // クリーンアップ関数で解放
  return () => {
    // 外部ライブラリの解放
  };
}, []); // 空の配列はマウント時に1回だけ実行

これらの例は、useEffectが非同期な操作や副作用をコンポーネントのライフサイクルに統合する方法を示しています。
useEffectは特定のイベントが発生したときにコードを実行するための柔軟で強力な手段です。