投稿

[今さら始める React マスター #5] useEffectとコンポーネントの副作用

ReactのuseEffectを使って、データ取得、タイマー、画面表示後の処理を扱う基本を説明します。

[今さら始める React マスター #5] useEffectとコンポーネントの副作用

useEffectとは?

useEffect は、Reactコンポーネントの描画後に実行したい処理を書くためのHookです。

たとえば次のような処理に使います。

  • APIからデータを取得する
  • タイマーを開始する
  • ブラウザのタイトルを変える
  • イベントリスナーを登録する

基本形

1
2
3
4
5
6
7
8
9
import { useEffect } from "react";

function App() {
  useEffect(() => {
    console.log("画面に表示されました");
  }, []);

  return <h1>Hello</h1>;
}

第二引数の [] は依存配列です。この例はマウント時の処理を示します。開発中にStrict Modeを使うと、動作確認のためセットアップとクリーンアップが追加で実行されることがあります。「ログが必ず一回」と数えるより、登録した処理を片付けられるかに注目しましょう(公式の説明)。

Stateが変わったときに実行する

1
2
3
useEffect(() => {
  document.title = `Count: ${count}`;
}, [count]);

この断片は、count が定義されたコンポーネントの中に置く想定です。依存配列に count を入れると、その値の変化に合わせてタブのタイトルが変わります。前の空配列の例とは別の使い方として比べてください。

クリーンアップ

タイマーやイベントリスナーを使う場合は、後片付けが必要です。

1
2
3
4
5
6
7
useEffect(() => {
  const id = setInterval(() => {
    console.log("tick");
  }, 1000);

  return () => clearInterval(id);
}, []);

return した関数がクリーンアップ処理になります。

学習のポイント

useEffect は便利ですが、何でも入れる場所ではありません。まずは「画面に表示された後に外部とやり取りする処理」と考えると理解しやすいです。

この投稿は投稿者によって CC BY 4.0 の下でライセンスされています。