ThemeSelect.vue 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. <template>
  2. <BasicModal v-bind="config" title="切换主题" v-model:visible="visible" style="padding: 0 10px">
  3. <a-radio-group v-model:value="themeSelected" @change="change">
  4. <a-radio v-for="item in options" :key="item.value" :value="item.value">{{ item.label }}</a-radio>
  5. </a-radio-group>
  6. </BasicModal>
  7. </template>
  8. <script lang="ts" setup>
  9. // 更换主题后的逻辑参考 /@/components/Application 的主题切换组件
  10. import { ref } from 'vue';
  11. import { BasicModal } from '/@/components/Modal';
  12. import { ThemeEnum } from '@/enums/appEnum';
  13. import { useRootSetting } from '/@/hooks/setting/useRootSetting';
  14. import { updateDarkTheme } from '/@/logics/theme/dark';
  15. import { updateHeaderBgColor, updateSidebarBgColor } from '/@/logics/theme/updateBackground';
  16. const visible = ref(false);
  17. const config = {
  18. maskClosable: false,
  19. canFullscreen: false,
  20. width: '300px',
  21. minHeight: 20,
  22. maxHeight: 20,
  23. showCancelBtn: false,
  24. showOkBtn: false,
  25. };
  26. // const layout = {
  27. // labelCol: { span: 6 },
  28. // wrapperCol: { span: 16 },
  29. // };
  30. const options = [
  31. {
  32. value: ThemeEnum.DARK,
  33. label: '深色',
  34. },
  35. {
  36. value: ThemeEnum.LIGHT,
  37. label: '浅色',
  38. },
  39. {
  40. value: ThemeEnum.VENT1,
  41. label: '默认',
  42. },
  43. ];
  44. const { getDarkMode, setDarkMode } = useRootSetting();
  45. const themeSelected = ref<ThemeEnum>(getDarkMode.value as ThemeEnum);
  46. function show() {
  47. visible.value = true;
  48. }
  49. // function close() {
  50. // visible.value = false;
  51. // }
  52. function change() {
  53. setDarkMode(themeSelected.value);
  54. updateDarkTheme(themeSelected.value);
  55. updateHeaderBgColor();
  56. updateSidebarBgColor();
  57. }
  58. defineExpose({
  59. show,
  60. });
  61. </script>
  62. <style lang="less" scoped></style>