環境
MacBook Pro (2.3 GHz 8コアIntel Core i9)
macOS 14.0(23A344)
Homebrew 4.3.8
gh 2.52.0
まとめ
デフォルトの動作では、副作用関数はレンダーの完了時に毎回実行されます。
新しい購読を設定する必要があるのは毎回の更新ごとではなく、source プロパティが変化した場合のみです。
useEffect の第 2 引数として、この副作用が依存している値の配列を渡します。
つまり、useEffect
の依存配列(第二引数)を活用することで、State
やProps
が変更された場合にどの副作用(関数)を実行するかを細かく制御できます。
基本構文
State
またはProps
として、count
を設定した場合、console.log("countが変更されたときに実行")
が副作用として実行される
e.g.
useEffect(() => {
console.log("countが変更されたときに実行");
}, [count]); // countが変更されたときのみ実行
活用例
フォルダ構成
folda_structure
├── public/
│ ├── index.html
└── src/
│ ├── index.js(index.jsx)
│ └── App.js(App.jsx)
index.html
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>React App</title>
</head>
<body>
<div id="root"></div>
</body>
</html>
index.js
index.js
import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import { App } from "./App";
const rootElement = document.getElementById("root");
const root = createRoot(rootElement);
root.render(
<StrictMode>
<App />
</StrictMode>
);
App.js(useEffectなし)
- 課題:on/off
button
を使って、\(^o^)/オワタ
の表示・非表示が制御できない - 考察:レンダリングの度に、
if
文に入るため、onClickToggle
の制御が上書きされる
App.jsx
import { useState } from "react";
export const App = () => {
const [num, setNum] = useState(0);
const onClickCountUp = () => {
setNum(num + 1);
};
const [isShowFace, setIsShowFace] = useState(false);
const onClickToggle = () => {
setIsShowFace(!isShowFace);
};
if (num > 0) {
if (num % 3 === 0) {
isShowFace || setIsShowFace(true);
} else {
isShowFace && setIsShowFace(false);
}
}
return (
<>
<button onclick={onClickCountUp}>カウントアップ</button>
<p>{num}</p>
<button onclick={onClickToggle}>on/off</button>
{isShowFace && <p>\(^o^)/オワタ</p>}
</>
);
};
App.js(useEffectあり)
- 対策:
useEffect
を使用して、num
が更新された時のみif
文が作動するように設定 - 結果:on/off
button
を使って、\(^o^)/オワタ
の表示・非表示が制御できる
App.jsx
import { useEffect, useState } from "react";
export const App = () => {
const [num, setNum] = useState(0);
const onClickCountUp = () => {
setNum(num + 1);
};
const [isShowFace, setIsShowFace] = useState(false);
const onClickToggle = () => {
setIsShowFace(!isShowFace);
};
+ useEffect(() => {
if (num > 0) {
if (num % 3 === 0) {
isShowFace || setIsShowFace(true);
} else {
isShowFace && setIsShowFace(false);
}
}
+ }, [num]);
return (
<>
<button onclick={onClickCountUp}>カウントアップ</button>
<p>{num}</p>
<button onclick={onClickToggle}>on/off</button>
{isShowFace && <p>\(^o^)/オワタ</p>}
</>
);
};
処理の流れ
カウントアップbutton
の操作(useEffect
Hook内)
-
num + 1
で、引数num
を1つずつ増やす -
useState(true)
で、isShowFace
の初期値をfalse
に設定する -
||
で、引数(state
)isShowFace
がfalse
の時にsetIsShowFace(true)
でisShowFace
をtrue
にする -
&&
で、引数(state
)isShowFace
がtrue
の時にsetIsShowFace(false)
でisShowFace
をfalse
にする -
&&
で、引数(state
)isShowFace
がtrue
の時に\(^o^)/オワタ
が表示される
on/offbutton
の操作(useEffect
Hook外)
-
!isShowFace
で、引数isShowFace
を反転させる -
&&
で、引数isShowFace
がtrue
の時に\(^o^)/オワタ
が表示される