Skip to content

Commit b17aac0

Browse files
authored
Update themeStore.ts
1 parent 293ff96 commit b17aac0

File tree

1 file changed

+50
-42
lines changed

1 file changed

+50
-42
lines changed

front/src/stores/themeStore.ts

Lines changed: 50 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -3,52 +3,60 @@ import { ref, watch } from 'vue'
33

44
type 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

Comments
 (0)