今回は、Reactの ライフサイクルメソッド(useEffect)について学習していきます。
ライフサイクルメソッド(useEffect)とは
- useEffectフックはReactのコンポーネントに副作用を簡単に追加する機能
- 副作用とは、コンポーネントがレンダリングされたタイミングだったり、更新された特定にタイミングで何かしらの処理を実行すること
useEffectの基本形
useEffect
は、Reactのコンポーネントのライフサイクルに関連する処理を記述するためのフックで、コンポーネントのマウント時とアンマウント時と再レンダリング時のタイミングで実行したい処理を簡潔に書くことができる
- マウント
- コンポーネントがDOMに追加されたときに実行される処理
- 利用例 : 初期化処理、データのフェッチ、イベントリスナーの登録など
- アンマウント
- コンポーネントがDOMから削除されるときに実行されるクリーンアップ処理
- 利用例 : イベントリスナーの解除、タイマーのクリア、サーバー接続の切断など
- 再レンダリング
- コンポーネントの状態やプロパティが変更されて再描画されるときに発生する。
- 利用例: 動的なデータやUI更新に応じた処理。
- 第一引数
- 副作用の処理(エフェクト処理)
- 第二引数
useEffect
の実行タイミングを指定する変数や状態を配列形式で渡す
クリーンアップ処理
return () => {}
で、クリーンアップ処理を実行できます。- クリーンアップ処理とは、コンポーネントがアンマウントされる際や、依存配列の変更により
useEffect
が再実行される前に実行される処理のことです。
useEffect(() => {
console.log("初回マウント時および todoList が変更されたときに実行");
// クリーンアップ処理
return () => {
console.log("アンマウント時または todoList が変更される前に実行");
};
}, [todoList]);
第二引数に依存配列を指定した場合
初回のマウント時に実行され、その後 todoList
が変更されるたびに再実行されます。
useEffect(() => {
console.log("初回マウント時および todoList が変更されたときに実行");
}, [todoList]);
引数がない場合
初回のマウント時に実行され、その後コンポーネントが再レンダリングされるたびに実行されます。クリーンアップ処理はありません。
useEffect(() => {
console.log("マウント時および再レンダリング時に実行");
});
引数が空配列の場合
初回のマウント時のみ実行され、依存配列が空なので再レンダリングでは実行されません。
初期のマウント時に一度だけ実行したい場合などに使用します。
使用例: 初期のデータフェッチ取得など
useEffect(() => {
console.log("初回マウント時に実行");
}, []);
TODOアプリでローカルストレージを使ったuseEffectの使用例
マウント時に1度だけ、ローカルストレージからデータを取得する
useEffect(() => {
const todoListData = localStorage.getItem("todo-list");
if (todoListData) {
setTodoList(JSON.parse(todoListData));
}
}, []);
todoListが更新されるたびに、ローカルストレージに保存
// TODOが追加されるごとに、todoListが更新される
const [todoList, setTodoList] = useState<Todo[]>([]);
// todoListが更新される度に、"todo-list"という名前でローカルストレージに保存
useEffect(() => {
localStorage.setItem("todo-list", JSON.stringify(todoList));
}, [todoList]);

リポジトリ
※復習内容のメモ
フィルターのお決まりの処理
setTodoListをuseStateで定義
const [todoList, setTodoList] = useState<Todo[]>([]);
- コンポーネントまで、setTodoListをバケツリレーしてフィルタリング
- フィルタリングする処理をよくコード読む
setTodoList
の引数(prev) => prev.filter((todo) => todo.id !== id)
const handleDelete = () => {
setTodoList((prev) => prev.filter((todo) => todo.id !== id));
};
バケツリレー
- Propsのバケツリレーが必要なシチュエーションをコードをよく読む
感想
useEffect
と localStorage
へデータを保存する方法を学習しました。
バックエンドやデータベースを勉強しないと、ブラウザをリロード時にデータを保管できないよなーって思っていたので、手軽に保管できる機能を学習できて良かったです!
ちょっとした成果物だと、localStorage
を使って作成できそうです。
今回は、データの更新ごとにlocalStorage
へデータを保管する。という例題で練習しました。
様々なシチュエーションで副作用を使いた場面があるのだろうなーと今は予想しています。useEffect
の基本的な概念は理解できたので、使うシチュエーションをよりキャッチアップしていきたいと思いました。