前回のステップ4で「タスクの完了状態保存」機能を実装しました。 現在、タスクの追加・完了状態変更はlocalStorageに保存されますが、既にdeleteTask()関数にも保存機能が含まれています。
今回は、deleteTask()関数の動作を詳しく確認し、削除操作も含めた 完全なCRUD操作の永続化 について学習します。
現在の状況確認:
現在のdeleteTask関数を確認し、localStorage保存機能が含まれていることを学習します。
function deleteTask(id) {
// 削除前にタスク情報を取得(ログ出力用)
const taskToDelete = tasks.find(task => task.id === id);
// 指定されたIDのタスクを配列から削除
tasks = tasks.filter(function (task) {
return task.id !== id;
});
console.log(`🗑️ タスク「${taskToDelete.text}」を削除しました`);
// 【確認①】削除をlocalStorageにも反映する関数呼び出し(20文字)
// 答え: ____________________
____________________;
// 画面表示を更新
renderTasks();
updateProgress();
console.log("💾 削除操作をlocalStorageに保存しました");
}
Webアプリケーションの基本操作(CRUD)全てでlocalStorage同期が実現されていることを確認します。
// 【確認②】以下のCRUD操作とlocalStorage保存の対応を確認してください
// Create(作成): addTask() → ?
// Read(読み取り): ? → JSON.parse()
// Update(更新): toggleTask() → ?
// Delete(削除): deleteTask() → ?
// 答え:
// Create(作成): addTask() → ____________________(20文字)
// Read(読み取り): ____________________(25文字) → JSON.parse()
// Update(更新): toggleTask() → ____________________(20文字)
// Delete(削除): deleteTask() → ____________________(20文字)
実装を理解した後、以下の手順で完全な永続化を確認します。
deleteTask
関数内でsaveTasksToStorage()
が呼び出されていることを確認します。これにより、タスク配列から特定のタスクが削除された後、その変更がlocalStorageに保存されます。addTask()
関数が新しいタスクを作成し、saveTasksToStorage()
で保存します。loadTasksFromStorage()
関数がページ読み込み時にlocalStorageからデータを読み取ります。toggleTask()
関数がタスクの完了状態を更新し、saveTasksToStorage()
で保存します。deleteTask()
関数がタスクを削除し、saveTasksToStorage()
で保存します。function deleteTask(id) {
// ... (既存のコード) ...
// 【確認①】削除をlocalStorageにも反映する関数呼び出し
saveTasksToStorage(); // この呼び出しがあることを確認
// ... (既存のコード) ...
}
// Create(作成): addTask() → saveTasksToStorage()
// Read(読み取り): loadTasksFromStorage() → JSON.parse() (関数内部で実行)
// Update(更新): toggleTask() → saveTasksToStorage()
// Delete(削除): deleteTask() → saveTasksToStorage()
この演習シリーズを通じて、タスク管理アプリケーションにおける基本的なデータ操作であるCRUD(Create, Read, Update, Delete)のそれぞれが、localStorageと同期されるようになりました。
addTask
関数で新しいタスクが作られると、saveTasksToStorage
によってlocalStorageに保存されます。loadTasksFromStorage
がlocalStorageからデータを読み込み、タスクリストを復元します。toggleTask
関数でタスクの完了状態が変更されると、saveTasksToStorage
によってその変更がlocalStorageに保存されます。deleteTask
関数でタスクが削除されると、saveTasksToStorage
によってその削除がlocalStorageに反映されます。
これにより、ユーザーが行った全ての変更がブラウザを閉じても失われず、次回起動時にも保持される、一貫性のある永続化が実現できています。アプリケーションが表示している情報(画面上のタスクリスト)と、永続化されているデータ(localStorage内のタスクデータ)が常に一致している状態を「データ整合性が保たれている」と言います。saveTasksToStorage
を各操作の適切なタイミングで呼び出すことにより、この整合性を維持しています。
この一連のステップは、Webアプリケーションにおけるクライアントサイドの状態管理の基本的なアプローチを示しています。ユーザー操作によって変化するデータを適切にメモリ上で管理し、それをブラウザのストレージ機能と同期させることで、よりリッチで実用的なユーザー体験を提供できます。
補足資料/localStorage_API詳解.md
補足資料/データ構造設計.md
補足資料/ブラウザストレージ比較.md
全てのステップが完了した状態で、以下の総合的な動作確認を行いましょう。
completed
が true
になっている。これらの確認を通じて、CRUD操作全てにおいてデータが正しく永続化され、アプリケーションが期待通りに動作することを検証します。
setItem
, getItem
, removeItem
, clear
)と、オブジェクトを保存するためのJSON.stringify
/JSON.parse
の必要性を学びました。tasks
配列をJSON文字列に変換してlocalStorageに自動保存するsaveTasksToStorage
関数を実装し、addTask
関数と連携させました。また、try...catch
によるエラーハンドリングの基本を導入しました。tasks
配列を復元し、画面に再表示するloadTasksFromStorage
関数を実装しました。DOMContentLoaded
イベントリスナー内でこれを呼び出すことで、初期表示を実現しました。completed
プロパティ)が変更された際に、toggleTask
関数内でsaveTasksToStorage
を呼び出し、変更を永続化しました。deleteTask
関数でも同様にsaveTasksToStorage
が呼び出されることを確認し、タスクの削除操作もlocalStorageに反映されることを学びました。これにより、CRUD操作全てにおけるデータ永続化が完成しました。おめでとうございます!これで、localStorageを利用してToDoリストのデータを永続化する基本的な機能を全て実装できました。