iT邦幫忙

2026 iThome 鐵人賽

DAY 18
0

今天主要替記帳 App 加入 Dark Mode 暗黑模式,讓使用者可以選擇自己想要的主題。

加入全域暗黑模式
我在 Header 加入暗黑模式切換按鈕,並用 isDarkMode 記錄目前的主題狀態。
接著Props會把 isDarkMode 傳給 Header、ExpenseList、TotalCard 等元件,讓不同區塊可以根據目前模式改變樣式。
我也複習了 React 的單向資料流,了解 Dark Mode 的狀態可以由父元件統一管理,再透過 Props 往下傳給需要使用的子元件,而不是每個元件都各自建立一份狀態。

讓 Canvas 圖表也跟著切換
這裡圖表比較特別的是,Canvas 畫出來的圖表不像一般 HTML 元件可以直接改 CSS。
所以我在 isDarkMode 改變時,讓 Canvas 重新繪製,根據目前的模式更新文字與圖表顏色。

例如重新繪製前會先清空畫布:
https://ithelp.ithome.com.tw/upload/images/20260919/201839496Uo3GuwXIQ.jpg
再使用新的顏色重新繪製。
重點:Canvas 的內容是畫上去的,不是一般可以直接修改 CSS 的 DOM 元素。

切換月份時清除選取狀態
除了 Dark Mode,我也順便修正之前批次操作留下的 UX 問題。
如果使用者在某個月份勾選了資料,再切換到另一個月份,原本的 selectedIds 可能還保留著上一個月份的資料。
因此加入:
https://ithelp.ithome.com.tw/upload/images/20260919/201839494bUwRLVbpe.jpg
當 currentMonth 改變時,就會自動清空選取狀態,避免使用者切換月份後誤刪其他月份的資料。

在這邊呈現一下成果:
白天模式:
https://ithelp.ithome.com.tw/upload/images/20260919/201839491NsEpoVdEa.jpg
暗黑模式:
https://ithelp.ithome.com.tw/upload/images/20260919/20183949lBIyXgtSxQ.jpg

總結:
今天完成了...

  • Dark Mode 全域切換
  • 不同元件的深色主題統一
  • Canvas 圖表跟著主題重新繪製
  • 切換月份時自動清除批次選取
  • React.memo 與 Props 改變後重新渲染的關係
    即使功能做出來之後,也要注意不同元件之間的狀態和視覺是否一致,才不會出差錯。

上一篇
Day 17|CSV 匯出與 Excel 整合
系列文
Vibe Coding 實戰手冊:30 天打造具備預算控管與數據視覺化的 React 記帳應用18
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言