今天進入第二十五今天的目標,使用 useContext 與 Custom Hook 重構 App 的狀態管理,
減少原本需要一層一層傳遞的 Props。
不過在完成重構後進行實際測試時,我發現「存錢目標」和「支出明細」之間還存在資料不同步的問題,
因此今天也順便把刪除功能重新整理,讓兩邊的資料可以互相連動。
用 useContext 整理全域狀態
之前像 Toast、語系、匯率等資料,需要透過 Props 從父元件一路傳到不同頁面。
這次改用 useContext 搭配 Custom Hook useAppContext,讓需要這些資料的元件可以直接取得。
原本:
App → Page → Component → Props → Component
重構後:
AppContext → 需要的元件直接使用
這樣可以減少 Prop Drilling,也讓不同頁面之間共享資料時更加方便。
測試後發現「刪除目標」沒有同步
完成 Context 重構後,我在測試時發現存錢功能有一個問題:
刪除「旅費」這個存錢目標後,原本存入旅費的那筆支出紀錄還留在明細裡。
也就是:
刪除目標 → 目標消失,但支出還存在
這會讓總結餘仍然被那筆存入目標的金額扣著。
反過來也有同樣的問題:
刪除存錢明細 → 明細消失,但目標進度沒有減少
因此我修改了 handleDeleteGoal,在使用者刪除目標時,同時找出屬於這個目標的明細:
這裡我用了兩種方式比對:
反過來刪除明細,也要更新目標進度
如果使用者從明細頁直接刪除「存入目標」的紀錄,也必須把存錢目標的金額扣回來。
這裡比較重要的是:
即使資料發生異常或重複扣除,也不會讓存錢目標變成負數。
整個資料流變成:
刪除明細 → 找到 goalId → 找到對應目標 → 扣除金額 → 更新目標進度
另外,我也加入 Toast,讓使用者知道目標進度已經同步修改。
批量刪除也要處理資料聯動
之前的批量刪除只會處理 items,這次則增加判斷:
選取的明細中有存錢紀錄 → 找到對應目標 → 同步扣除目標金額
這也讓我發現,新增一個功能時,不能只想到「正常操作」,還要思考:
總結: