theme.ts 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import { defineStore } from 'pinia'
  2. interface ThemeState {
  3. theme: string
  4. isManualChange: boolean
  5. }
  6. export const useThemeStore = defineStore('theme', {
  7. state: (): ThemeState => ({
  8. theme: localStorage.getItem('theme') || 'light',
  9. isManualChange: JSON.parse(localStorage.getItem('isManualChange')) || false
  10. }),
  11. actions: {
  12. toggleTheme(theme: string, isManualChange = false) {
  13. localStorage.setItem('theme', theme)
  14. this.theme = theme
  15. const html = document.documentElement
  16. if (html.classList.contains('dark') && theme === 'light') {
  17. unloadDarkTheme()
  18. html.classList.remove('dark')
  19. } else if (!html.classList.contains('dark') && theme === 'dark') {
  20. loadDarkTheme()
  21. html.classList.add('dark')
  22. }
  23. // 主动修改主题后,不再跟随系统设置
  24. if (isManualChange) {
  25. localStorage.setItem('isManualChange', JSON.stringify(isManualChange))
  26. this.isManualChange = isManualChange
  27. }
  28. }
  29. }
  30. })
  31. // 动态加载暗黑主题
  32. async function loadDarkTheme() {
  33. await import('element-plus/theme-chalk/dark/css-vars.css') // 动态导入暗黑主题
  34. }
  35. // 动态移除暗黑主题
  36. function unloadDarkTheme() {
  37. const darkThemeStylesheet = document.getElementById('dark-theme-style')
  38. if (darkThemeStylesheet) {
  39. darkThemeStylesheet.remove()
  40. }
  41. }