iT邦幫忙

2026 iThome 鐵人賽

DAY 26
0
Vibe Coding

Vibe Coding 實戰手冊:30 天打造具備預算控管與數據視覺化的 React 記帳應用系列 第 26 篇

Day 26|localStorage 安全防禦與資料備援:讓資料保存更穩定

  • 分享至 

  • xImage
  •  

今天進入 Day 26,原本設的目標在之前就順帶做了,所以今天主要是重新整理 App 的 localStorage,讓資料在讀取或寫入發生問題時,不會直接造成白畫面。
之前的寫法比較直接,如果遇到資料格式損壞、Storage 無法使用等情況,可能會讓 JSON.parse() 直接拋出錯誤,所以我這次加入防錯與備援機制。

先處理 localStorage 的讀取錯誤
原本直接使用 localStorage.getItem() 搭配 JSON.parse(),只要儲存的資料格式有問題,就可能造成 App 崩潰。
所以我把讀取包進 try...catch:
https://ithelp.ithome.com.tw/upload/images/20260927/20183949axYztIHbzL.jpg
這樣如果資料正常,就回傳原本的資料;如果解析失敗,就回傳預設值。
讀取 Storage → JSON.parse() → 成功:回傳資料 / 失敗:回傳預設值
這樣即使 Storage 裡的資料出了問題,App 也不會因為一個錯誤直接白屏。
下面是測試過程:
https://ithelp.ithome.com.tw/upload/images/20260927/201839498hLvbx6C13.png
https://ithelp.ithome.com.tw/upload/images/20260927/20183949XVfv9U12P7.png

寫入資料也需要防錯
讀取有防護之後,寫入也不能忽略。
https://ithelp.ithome.com.tw/upload/images/20260927/20183949DU9ghZUSyO.jpg
這裡先用 JSON.stringify() 把 JavaScript 資料轉成字串,再交給 localStorage 儲存。
流程就是:
資料 → JSON.stringify() → localStorage.setItem() → 儲存
如果寫入時發生錯誤,也會被 catch 接住,不會直接讓整個 App 崩潰。

用 Lazy Initializer 讀取初始資料
初始化 items 時,我也改成:
https://ithelp.ithome.com.tw/upload/images/20260927/201839498l3XCSTRYq.jpg
這裡的 () => ... 是 React 的 Lazy Initializer。
和直接把函式執行結果放進 useState 不同,這種寫法可以把「讀取 Storage」這個初始化工作交給 React 在初始化 State 時執行,避免每次重新渲染都重新做這個讀取動作。

讓 State 自動同步到 localStorage
接著搭配原本的 useEffect:
https://ithelp.ithome.com.tw/upload/images/20260927/20183949pGPTEKuifV.jpg
只要 items 發生變化,就會重新寫入 Storage。
整個資料流程變成:
使用者操作 → setItems() → State 更新 → useEffect → localStorage

總結:

  • try...catch 可以處理 Storage 讀寫錯誤
  • JSON.parse() / JSON.stringify() 負責資料的讀取與儲存轉換
  • Fallback 可以在資料損壞時提供預設值
  • useState(() => ...) 是 Lazy Initializer
  • useEffect 可以讓 State 改變後自動同步 Storage
  • 資料流程:UI → State → Effect → Storage

上一篇
Day 25|狀態重構與目標刪除聯動:讓不同資料真正同步
下一篇
Day 27|整理專案與編寫 README:讓成果有跡可循
系列文
Vibe Coding 實戰手冊:30 天打造具備預算控管與數據視覺化的 React 記帳應用 共 29 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言