themeSwitch.html 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. {{define "component/themeSwitchTemplate"}}
  2. <template>
  3. <a-switch size="small" :default-checked="themeSwitcher.isDarkTheme"
  4. @change="themeSwitcher.toggleTheme()">
  5. </a-switch>
  6. </template>
  7. {{end}}
  8. {{define "component/themeSwitcher"}}
  9. <script>
  10. function createThemeSwitcher() {
  11. const isDarkTheme = localStorage.getItem('dark-mode') === 'true';
  12. const theme = isDarkTheme ? 'dark' : 'light';
  13. document.querySelector('body').setAttribute('class', theme)
  14. return {
  15. isDarkTheme,
  16. get currentTheme() {
  17. return this.isDarkTheme ? 'dark' : 'light';
  18. },
  19. toggleTheme() {
  20. this.isDarkTheme = !this.isDarkTheme;
  21. localStorage.setItem('dark-mode', this.isDarkTheme);
  22. document.querySelector('body').setAttribute('class', this.isDarkTheme ? 'dark' : 'light')
  23. document.getElementById('message').className = themeSwitcher.currentTheme;
  24. },
  25. };
  26. }
  27. const themeSwitcher = createThemeSwitcher();
  28. Vue.component('theme-switch', {
  29. props: [],
  30. template: `{{template "component/themeSwitchTemplate"}}`,
  31. data: () => ({ themeSwitcher }),
  32. mounted() {
  33. this.$message.config({getContainer: () => document.getElementById('message')});
  34. document.getElementById('message').className = themeSwitcher.currentTheme;
  35. }
  36. });
  37. </script>
  38. {{end}}