useEffect

表示されたことをきっかけにする

前のレッスンで、副作用の置き場所は2つあると学びました。操作がきっかけならイベントハンドラー、表示されたこと自体がきっかけなら useEffect です。

「ページが出たらデータを取りに行く」「表示された時刻を記録する」のような仕事には、押すボタンがありません。こういうときに使うのが useEffect です。

書き方

useEffect は引数を2つ取ります。1つめが実行したい処理の関数、2つめが依存配列です。

import { useEffect } from "react"; export default function App() { useEffect(() => { console.log("画面に出ました"); }, []); return <h1>あおいのプロフィール</h1>; }

2つめの [] は「何にも依存しない」という意味です。こう書くと、中の処理は 最初の描画が終わったあとに1回だけ 走ります。部品が画面に現れることをマウントと呼ぶので、「マウント時に1回」と言います。

大事なのは、描画の前ではなく あと だという点です。React はまず画面を出し、それが終わってから effect を呼びます。だから画面の表示が effect に待たされることはありません。

画面に出したいときは state と組み合わせる

console.log は開発者ツールにしか出ません。結果を利用者に見せたいときは、effect の中で state を更新します。

const [status, setStatus] = useState("読み込み中"); useEffect(() => { setStatus("読み込み完了"); }, []);

まず「読み込み中」の画面が出て、そのあと effect が走って「読み込み完了」に変わります。1周ぶん遅れて切りかわる、この流れを覚えておいてください。

つまずきどころ

useEffect は import が必要です。import { useState, useEffect } from "react"; のように、使うフックをまとめて書きます。また、2つめの [] を書き忘れると毎回のレンダーで走ってしまいます。そこは次のレッスンで扱います。

演習

表示された時点でメッセージを切りかえます。

ヒント

App.jsx
App.jsx
プレビュー

できているか

  • h1 に「あおいのプロフィール」と表示されている
  • 状態を出す p が残っている
  • 表示されたあと「読み込み完了」に変わっている