📘

useEffectの3つの使い方

2024/03/08に公開
3

React頻出のuseEffectについて、最近ちょっとだけ知ったので備忘録としてまとめます。対象は私のようなReact初心者です。

3つのuseEffectの書き方とその違い

1.毎レンダリング時に実行

useEffect(() => {
    console.log("レンダリングされました。");
})

一つ目はレンダリングされるたびに実行されるuseEffect()です。

2.初回レンダリング時のみ実行

useEffect(() => {
    console.log("初回レンダリングが実行されました。");
}, [])

二つ目もレンダリング実行時に実行されるのですが、初回レンダリング時のみという制限がつきます。最後に[]があるのが一つ目と違います。

3.監視対象の変数の更新時に実行

useEffect(() => {
    console.log("valが変更されました。");
}, [val])

最後は監視対象の変数が更新された際に実行されるものです。監視対象の変数は末尾の[]の中に記載します。例ではvalという変数を監視しています。

useEffectの簡単な例

3つめのある変数を監視するuseEffectを使って、入力した内容がそのまま下に表示される簡単なコードを書いてみました。

import { useEffect, useState } from "react";
import "./styles.css";

export default function App() {
  const [inputTxt, setInputTxt] = useState("");
  const [txt, setTxt] = useState("");

  useEffect(() => {
    setTxt(inputTxt);
  }, [inputTxt]);

  return (
    <div className="App">
      <input
        type="text"
        value={inputTxt}
        onChange={(e) => setInputTxt(e.target.value)}
      />
      <p>{txt}</p>
    </div>
  );
}

input欄の下に表示させる変数txtとinput欄の中の文字列であるinputTxtの2つ用意して、input欄で何か文字が打たれたら(=inputTxtに変更があったら)、それをuseEffectで検知してtxtinputTxtの内容をセットするという流れです。

まとめ

useEffect()は基礎中の基礎だと思うので、何回も使って慣れていきたいですね。何か間違いがあれば指摘していただけると幸いです。

GitHubで編集を提案

Discussion

Honey32Honey32

失礼します。

https://ja.react.dev/learn/you-might-not-need-an-effect

にもあるように、大抵の場合で useEffect は不要で、その代わりにステート、Props、イベントハンドラ、3rdパーティのライブラリ、Next.js や Remex といったフレームワークだけで実装できることに注意が必要です。

上記の React 公式ドキュメントの解説の流れを見ても、序盤に useEffect は登場せず、「UI の記述」「インタラクティビティの追加」「stateの管理」の3つの章を割いて《React のステートと Props で UI を構築する方法》について解説しています。useEffect は、その次の「避難ハッチ」の章でようやく、下記のような解説とともに登場します。

この章では、React の「外側に踏み出して」外部システムに接続するための避難ハッチ (escape hatch) を学びます。アプリケーションのロジックとデータフローの大部分は、これらの機能に依存しないようにすべきです。
https://ja.react.dev/learn/escape-hatches

個人的には、useEffect を使わずに実装できるケースとして、特に「ステートのリフトアップ」「レンダー中に計算する」の2パターンを使いこなすことが重要だと思っています。

SomahcSomahc

Honey32 様

ご指摘ありがとうございます。useEffectはあくまで最終手段のような位置付けなんですね。とても勉強になりました!

本記事の冒頭にも注意書きを追加させていただきました。ありがとうございます。