@@ -23,12 +23,15 @@ export default function ThemeToggle() {
2323 setMounted ( true ) ;
2424 } , [ ] ) ;
2525
26- // 同步 Redux 主题到 next-themes
26+ // 同步 next-themes 主题到 Redux
27+ // next-themes 是单一事实来源,Redux 只是为了保持状态一致性以便其他组件使用
2728 useEffect ( ( ) => {
28- if ( reduxTheme && nextTheme !== reduxTheme ) {
29- setNextTheme ( reduxTheme ) ;
29+ if ( nextTheme && ( nextTheme === 'light' || nextTheme === 'dark' || nextTheme === 'system' ) ) {
30+ if ( reduxTheme !== nextTheme ) {
31+ dispatch ( setTheme ( nextTheme as ThemeMode ) ) ;
32+ }
3033 }
31- } , [ reduxTheme , nextTheme , setNextTheme ] ) ;
34+ } , [ nextTheme , reduxTheme , dispatch ] ) ;
3235
3336 // 确定当前实际显示的主题
3437 const currentTheme = nextTheme === 'system' ? systemTheme : nextTheme ;
@@ -55,13 +58,10 @@ export default function ThemeToggle() {
5558 */
5659 const toggleTheme = ( ) => {
5760 // 在 light 和 dark 之间切换
58- const newTheme : ThemeMode = isDark ? 'light' : 'dark' ;
59-
60- // 更新 next-themes
61+ const newTheme = isDark ? 'light' : 'dark' ;
62+
63+ // 只更新 next-themes,useEffect 会自动同步到 Redux
6164 setNextTheme ( newTheme ) ;
62-
63- // 更新 Redux store(会自动保存到 LocalStorage)
64- dispatch ( setTheme ( newTheme ) ) ;
6565 } ;
6666
6767 /**
@@ -76,7 +76,7 @@ export default function ThemeToggle() {
7676 < Button
7777 type = "text"
7878 icon = { isDark ? < SunOutlined aria-hidden = "true" /> : < MoonOutlined aria-hidden = "true" /> }
79- size = ' large'
79+ size = " large"
8080 onClick = { toggleTheme }
8181 className = "transition-theme flex items-center justify-center"
8282 aria-label = { getTooltipTitle ( ) }
0 commit comments