ステップ3: ページ読み込み時のタスク復元機能 (JSON解析 & 初期化処理)(穴埋め版)

導入・問題提起

前回のステップ2で「タスクを追加したときにlocalStorageに保存する」機能を実装しました。 しかし、ページを再読み込みしても保存したタスクが表示されません。これは、保存はできているものの、ページを開いたときにそのデータを読み込んで画面に表示する仕組みがまだないためです。

今回は、ページが読み込まれた時にlocalStorageから保存されたタスクを取得して、自動的に画面に復元する機能を実装します。

Before(現在の状態):

このステップの目標

After(実装後の状態):


考えてみよう

手順1: localStorage読み込み関数の作成

まず、localStorageからタスクデータを読み込む関数を作成します。

function loadTasksFromStorage() {
    try {
        // 【穴埋め①】localStorageから'todoTasks'キーの値を取得する
        const savedTasksJson = localStorage.getItem('todoTasks');
        
        // 【穴埋め②】取得した値がnullかどうかをチェックする条件文
        if (savedTasksJson === null) {
            console.log("📄 保存されたタスクデータがありません");
            return; // データがなければここで処理を終了
        }
        
        // 【穴埋め③】JSON文字列をJavaScriptオブジェクトに変換する
        const savedTasks = JSON.parse(savedTasksJson);
        
        // グローバルなtasks配列を復元されたデータで置き換え
        tasks = savedTasks; // tasks配列を直接更新
        
        console.log("📂 localStorageからタスクを復元しました:", savedTasks);
        
    } catch (error) {
        console.error("❌ localStorage読み込みエラー:", error);
        // エラー発生時は空のタスクリストとして扱うなどのフォールバック処理も考えられる
        tasks = []; // 安全のためtasksを空にする
        console.log("🔄 空のタスクリストで開始します");
    }
}

手順2: ページ読み込み時の初期化処理

DOMContentLoadedイベントにタスク復元処理を追加します。

document.addEventListener('DOMContentLoaded', function() {
    const taskInput = document.getElementById('taskInput');
    const addButton = document.getElementById('addButton');
    
    // 【穴埋め④】localStorageからタスクを読み込む関数を呼び出す
    loadTasksFromStorage(); // localStorageからタスクを読み込む
    
    // Enterキーでタスク追加
    taskInput.addEventListener('keypress', function(e) {
        if (e.key === 'Enter') {
            addTask();
        }
    });
    
    // ボタンクリックでタスク追加
    addButton.addEventListener('click', addTask);
    
    // 【穴埋め⑤】復元したタスクを画面に表示する関数を呼び出す
    renderTasks(); // 読み込んだタスクを画面に表示する
    
    // 【穴埋め⑥】進捗バーを更新する関数を呼び出す
    updateProgress(); // 進捗バーを更新する
});

✨ 最小限ヒント


動作確認チェックリスト

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

  1. タスクをいくつか追加し、localStorageにタスクデータが保存されることをブラウザのDevTools(開発者ツール)で確認します(Application > Local Storageで todoTasks キーの値を確認)。
  2. ページを再読み込みします。
  3. 確認事項:

解答例

手順1: localStorage読み込み関数の作成 (loadTasksFromStorage)

function loadTasksFromStorage() {
    try {
        // 【穴埋め①】localStorageから'todoTasks'キーの値を取得する
        const savedTasksJson = localStorage.getItem('todoTasks');
        
        // 【穴埋め②】取得した値がnullかどうかをチェックする条件文
        if (savedTasksJson === null) {
            console.log("📄 保存されたタスクデータがありません");
            return; // データがなければここで処理を終了
        }
        
        // 【穴埋め③】JSON文字列をJavaScriptオブジェクトに変換する
        const savedTasks = JSON.parse(savedTasksJson);
        
        // グローバルなtasks配列を復元されたデータで置き換え
        tasks = savedTasks; // tasks配列を直接更新
        
        console.log("📂 localStorageからタスクを復元しました:", savedTasks);
        
    } catch (error) {
        console.error("❌ localStorage読み込みエラー:", error);
        // エラー発生時は空のタスクリストとして扱うなどのフォールバック処理も考えられる
        tasks = []; // 安全のためtasksを空にする
        console.log("🔄 空のタスクリストで開始します");
    }
}

手順2: ページ読み込み時の初期化処理 (DOMContentLoaded)

document.addEventListener('DOMContentLoaded', function() {
    const taskInput = document.getElementById('taskInput');
    const addButton = document.getElementById('addButton');
    
    // 【穴埋め④】localStorageからタスクを読み込む関数を呼び出す
    loadTasksFromStorage(); // localStorageからタスクを読み込む
    
    // Enterキーでタスク追加
    taskInput.addEventListener('keypress', function(e) {
        if (e.key === 'Enter') {
            addTask();
        }
    });
    
    // ボタンクリックでタスク追加
    addButton.addEventListener('click', addTask);
    
    // 【穴埋め⑤】復元したタスクを画面に表示する関数を呼び出す
    renderTasks(); // 読み込んだタスクを画面に表示する
    
    // 【穴埋め⑥】進捗バーを更新する関数を呼び出す
    updateProgress(); // 進捗バーを更新する
});

ポイント解説

① データ永続化の完成サイクル

今回でデータ保存(ステップ2)と復元(ステップ3)が完成し、基本的な永続化が実現できました。

// 保存: JavaScript → JSON → localStorage
const tasksJson = JSON.stringify(tasks);
localStorage.setItem('key', tasksJson);

// 復元: localStorage → JSON → JavaScript  
const savedJson = localStorage.getItem('key');
const savedTasks = JSON.parse(savedJson);

② エラーハンドリングの重要性

localStorage操作では常にエラーの可能性があります:

③ ページ初期化パターン

document.addEventListener('DOMContentLoaded', function() {
    // 1. データ復元
    loadTasksFromStorage();
    // 2. 画面更新
    renderTasks();
    updateProgress();
    // 3. イベント設定
    setupEventListeners();
});

次のステップでは、タスクの完了状態も保存・復元できるようにします。

補足資料への誘導