📘
useEffectの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で検知してtxt
にinputTxt
の内容をセットするという流れです。
まとめ
useEffect()は基礎中の基礎だと思うので、何回も使って慣れていきたいですね。何か間違いがあれば指摘していただけると幸いです。
Discussion
失礼します。
にもあるように、大抵の場合で useEffect は不要で、その代わりにステート、Props、イベントハンドラ、3rdパーティのライブラリ、Next.js や Remex といったフレームワークだけで実装できることに注意が必要です。
上記の React 公式ドキュメントの解説の流れを見ても、序盤に useEffect は登場せず、「UI の記述」「インタラクティビティの追加」「stateの管理」の3つの章を割いて《React のステートと Props で UI を構築する方法》について解説しています。useEffect は、その次の「避難ハッチ」の章でようやく、下記のような解説とともに登場します。
個人的には、useEffect を使わずに実装できるケースとして、特に「ステートのリフトアップ」「レンダー中に計算する」の2パターンを使いこなすことが重要だと思っています。
Honey32 様
ご指摘ありがとうございます。useEffectはあくまで最終手段のような位置付けなんですね。とても勉強になりました!
本記事の冒頭にも注意書きを追加させていただきました。ありがとうございます。
参考になったなら幸いです!