ThemeSelect.vue 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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: '320px',
  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. value: ThemeEnum.DEEPBLUE,
  45. label: '深蓝',
  46. },
  47. ];
  48. const { getDarkMode, setDarkMode } = useRootSetting();
  49. const themeSelected = ref<ThemeEnum>(getDarkMode.value as ThemeEnum);
  50. function show() {
  51. visible.value = true;
  52. }
  53. // function close() {
  54. // visible.value = false;
  55. // }
  56. function change() {
  57. setDarkMode(themeSelected.value);
  58. updateDarkTheme(themeSelected.value);
  59. updateHeaderBgColor();
  60. updateSidebarBgColor();
  61. }
  62. defineExpose({
  63. show,
  64. });
  65. </script>
  66. <style lang="less" scoped></style>