今天進入 Day 26,原本設的目標在之前就順帶做了,所以今天主要是重新整理 App 的 localStorage,讓資料在讀取或寫入發生問題時,不會直接造成白畫面。
之前的寫法比較直接,如果遇到資料格式損壞、Storage 無法使用等情況,可能會讓 JSON.parse() 直接拋出錯誤,所以我這次加入防錯與備援機制。
先處理 localStorage 的讀取錯誤
原本直接使用 localStorage.getItem() 搭配 JSON.parse(),只要儲存的資料格式有問題,就可能造成 App 崩潰。
所以我把讀取包進 try...catch:
這樣如果資料正常,就回傳原本的資料;如果解析失敗,就回傳預設值。
讀取 Storage → JSON.parse() → 成功:回傳資料 / 失敗:回傳預設值
這樣即使 Storage 裡的資料出了問題,App 也不會因為一個錯誤直接白屏。
下面是測試過程:

寫入資料也需要防錯
讀取有防護之後,寫入也不能忽略。
這裡先用 JSON.stringify() 把 JavaScript 資料轉成字串,再交給 localStorage 儲存。
流程就是:
資料 → JSON.stringify() → localStorage.setItem() → 儲存
如果寫入時發生錯誤,也會被 catch 接住,不會直接讓整個 App 崩潰。
用 Lazy Initializer 讀取初始資料
初始化 items 時,我也改成:
這裡的 () => ... 是 React 的 Lazy Initializer。
和直接把函式執行結果放進 useState 不同,這種寫法可以把「讀取 Storage」這個初始化工作交給 React 在初始化 State 時執行,避免每次重新渲染都重新做這個讀取動作。
讓 State 自動同步到 localStorage
接著搭配原本的 useEffect:
只要 items 發生變化,就會重新寫入 Storage。
整個資料流程變成:
使用者操作 → setItems() → State 更新 → useEffect → localStorage
總結: