@@ -3,52 +3,60 @@ import { ref, watch } from 'vue'
33
44type ThemeMode = 'system' | 'light' | 'dark'
55
6- export const useThemeStore = defineStore ( 'theme' , ( ) => {
7- // 当前主题模式
8- const mode = ref < ThemeMode > ( 'system' )
9- // 实际是否为深色(根据系统 + 模式计算出来)
10- const isDarkTheme = ref ( false )
11-
12- // 应用主题
13- const applyTheme = ( ) => {
14- if ( mode . value === 'system' ) {
15- isDarkTheme . value = window . matchMedia ( '(prefers-color-scheme: dark)' ) . matches
16- } else {
17- isDarkTheme . value = mode . value === 'dark'
6+ export const useThemeStore = defineStore (
7+ 'theme' ,
8+ ( ) => {
9+ // 当前主题模式
10+ const mode = ref < ThemeMode > ( 'system' )
11+ // 实际是否为深色(根据系统 + 模式计算出来)
12+ const isDarkTheme = ref ( false )
13+
14+ // 应用主题
15+ const applyTheme = ( ) => {
16+ if ( mode . value === 'system' ) {
17+ isDarkTheme . value = window . matchMedia ( '(prefers-color-scheme: dark)' ) . matches
18+ } else {
19+ isDarkTheme . value = mode . value === 'dark'
20+ }
21+ document . documentElement . classList . toggle ( 'dark' , isDarkTheme . value )
1822 }
19- document . documentElement . classList . toggle ( 'dark' , isDarkTheme . value )
20- }
2123
22- // 切换主题模式(system → light → dark → system)
23- const toggleTheme = ( ) => {
24- if ( mode . value === 'system' ) {
25- mode . value = 'light'
26- } else if ( mode . value === 'light' ) {
27- mode . value = 'dark'
28- } else {
29- mode . value = 'system'
30- }
31- applyTheme ( )
32- }
33-
34- // 监听系统主题变化
35- const mediaQuery = window . matchMedia ( '(prefers-color-scheme: dark)' )
36- mediaQuery . addEventListener ( 'change' , ( ) => {
37- if ( mode . value === 'system' ) {
24+ // 切换主题模式(system → light → dark → system)
25+ const toggleTheme = ( ) => {
26+ if ( mode . value === 'system' ) {
27+ mode . value = 'light'
28+ } else if ( mode . value === 'light' ) {
29+ mode . value = 'dark'
30+ } else {
31+ mode . value = 'system'
32+ }
3833 applyTheme ( )
3934 }
40- } )
4135
42- // 每次 mode 改变都应用
43- watch ( mode , ( ) => applyTheme ( ) , { immediate : true } )
36+ // 监听系统主题变化
37+ const mediaQuery = window . matchMedia ( '(prefers-color-scheme: dark)' )
38+ mediaQuery . addEventListener ( 'change' , ( ) => {
39+ if ( mode . value === 'system' ) {
40+ applyTheme ( )
41+ }
42+ } )
4443
45- return {
46- mode,
47- isDarkTheme,
48- toggleTheme,
49- applyTheme,
50- }
51- } , {
52- persist : true , // 依旧支持持久化
53- } )
44+ // 每次 mode 改变都应用
45+ watch ( mode , ( ) => applyTheme ( ) , { immediate : true } )
5446
47+ // 🆕 初始化时同步 HTML 的 class(避免重复闪烁)
48+ if ( document . documentElement . classList . contains ( 'dark' ) ) {
49+ isDarkTheme . value = true
50+ }
51+
52+ return {
53+ mode,
54+ isDarkTheme,
55+ toggleTheme,
56+ applyTheme,
57+ }
58+ } ,
59+ {
60+ persist : true , // 继续支持持久化
61+ }
62+ )
0 commit comments