ステップ4: タスク完了状態の保存と復元 (完了状態の永続化)(穴埋め版)

導入・問題提起

前回のステップ3で「タスクの追加と復元」機能を実装しました。 しかし、現在はタスクの完了状態(チェックボックス)を切り替えても、その状態がlocalStorageに保存されません。

今回は、タスクの完了状態を切り替えた時も自動的にlocalStorageに保存し、ページを再読み込みしても完了状態が維持される機能を実装します。

現在の問題:

実装後の状態:

このステップの目標

考えてみよう

手順1: 現在のtoggleTask関数の確認

まず、現在のtoggleTask関数がどのように動作しているかを確認します。

// 現在のtoggleTask関数(localStorage保存なし)
function toggleTask(id) {
    // 指定されたIDのタスクを見つけて完了状態を切り替え
    tasks.forEach(function (task) {
        if (task.id === id) {
            task.completed = !task.completed;
            console.log(`🔄 タスク「${task.text}」の完了状態を切り替えました`);
        }
    });

    // 画面表示を更新
    renderTasks();
    updateProgress();
}

手順2: localStorage保存機能の追加

toggleTask関数にlocalStorage保存機能を追加します。

function toggleTask(id) {
    // 指定されたIDのタスクを見つけて完了状態を切り替え
    tasks.forEach(function (task) {
        if (task.id === id) {
            task.completed = !task.completed;
            console.log(`🔄 タスク「${task.text}」の完了状態を${task.completed ? '完了' : '未完了'}に切り替えました`);
        }
    });

    // 【穴埋め①】完了状態の変更をlocalStorageに保存する関数を呼び出す(20文字)
    ____________________;

    // 画面表示を更新
    renderTasks();
    updateProgress();

    console.log("💾 完了状態の変更をlocalStorageに保存しました");
}

手順3: 動作確認

実装完了後、以下の手順で動作確認を行います。

  1. タスクを追加(例:「買い物」)
  2. チェックボックスをクリックして完了状態にする
  3. DevToolsのConsoleで保存メッセージを確認
  4. ページを再読み込み
  5. 結果確認:タスクが完了状態で復元されることを確認

✨ 最小限ヒント

解答例

function toggleTask(id) {
    // 指定されたIDのタスクを見つけて完了状態を切り替え
    tasks.forEach(function (task) {
        if (task.id === id) {
            task.completed = !task.completed;
            console.log(`🔄 タスク「${task.text}」の完了状態を${task.completed ? '完了' : '未完了'}に切り替えました`);
        }
    });

    // 完了状態の変更をlocalStorageに保存
    saveTasksToStorage(); // この行を追加

    // 画面表示を更新
    renderTasks();
    updateProgress();

    console.log("💾 完了状態の変更をlocalStorageに保存しました");
}

ポイント解説

① 完全な永続化への一歩

このステップの修正により、タスクの「完了状態」もlocalStorageに保存・復元されるようになり、アプリケーションのデータ永続性がさらに向上しました。ユーザーがタスクのチェック状態を変更した後、ページを再読み込みしてもその状態が保持されます。

② オブジェクトプロパティ変更時の明示的な保存

JavaScriptの配列やオブジェクトの内容(例えば、タスクオブジェクトのcompletedプロパティ)を変更した場合、その変更をlocalStorageに反映させるためには、再度JSON.stringify()で全体のデータを文字列化し、localStorage.setItem()で保存し直す必要があります。saveTasksToStorage()関数がこの役割を担っています。

③ ユーザー操作とデータ同期の原則

ユーザーが行う操作(タスク追加、完了状態の切り替え、タスク削除など)によってアプリケーションのデータが変更される場合、その都度saveTasksToStorage()のような関数を呼び出して、変更後の最新データをlocalStorageと同期させることが、データの一貫性を保つための基本です。

補足資料への誘導

動作確認チェックリスト

実装が完了したら、以下の手順で動作を確認しましょう。

  1. タスクをいくつか追加します(例: 「牛乳を買う」「レポートを書く」「運動する」)。
  2. いずれかのタスクのチェックボックスをクリックして、完了状態にしてみましょう。
  3. 別のタスクのチェックボックスを何度かクリックして、完了・未完了を切り替えてみましょう。
  4. **ページを再読み込み(F5キー)**します。
  5. 全てのタスクを完了状態にしてみてください。

次のステップへの案内

ステップ4でタスク完了状態の永続化ができました。次のステップ5では、タスク削除操作もlocalStorageに正しく反映させ、CRUD操作(作成・読み取り・更新・削除)の全てでlocalStorageとの同期を完成させます。