例えばこんな感じでしょうか。
useEffect の第二引数は値の配列で、どれかの値が変わったら第一引数が実行されます。以下のコードでは初回および flag の値が変わった時に実行されるので、flag が true の時だけ実行したければ if で分岐すれば良いでしょう。
また、useEffect の第一引数の戻り値も重要で、クリーンアップ関数を返せば次に useEffect の第一引数を実行する前にクリーンアップ関数を実行してくれます。つまり、以下のコードでは flag を false にすればタイマー処理が停止します。
実行の流れはこんな感じになります。
- 初回レンダー時には flag は false なので、何もしません。
- ボタンを押すと flag が true になり、タイマー処理が開始され、クリーンアップ関数を返します。
- もう一度ボタンを押すと flag が false になり、クリーンアップ関数が実行されてタイマー処理が停止します。
- 2 へ戻る
jsx
1function App() {
2 const [count, setCount] = useState(0);
3 const [flag, setFlag] = useState(false);
4
5 useEffect(() => {
6 if (flag) {
7 const interval = setInterval(() => setCount(count => count + 1), 3000);
8 return () => clearInterval(interval);
9 }
10 }, [flag]);
11
12 return (
13 <>
14 <p>Count: {count}</p>
15 <button onClick={() => setFlag(!flag)}>{!flag ? 'Start' : 'Stop'}</button>
16 </>
17 );
18}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/07/30 07:56
2022/07/30 08:12
2022/07/30 09:05