問題一覧に戻る
中級副作用
問題40: クリーンアップ関数

returnでの後処理とメモリリークの防止を学びます。エフェクトのクリーンアップ処理を理解しましょう。

import React, { useState, useEffect } from 'react';

function Clock() {
const [show, setShow] = useState(true);

return (
<div>
<button onClick={() => setShow(!show)}>切替</button>
{show && <Timer />}
</div>
);
}

function Timer() {
const [time, setTime] = useState(0);

useEffect(() => {
// タイマーを設定
const id = setInterval(() => {
setTime(t => t + 1);
}, 1000);

// コンポーネントがアンマウントされる時のクリーンアップ処理
() => {
// タイマーをクリアしてメモリリークを防ぐ
clearInterval();
};
}, []);

return <p>経過: {time}秒</p>;
}

export default Clock;