ConfigGlobal.vue 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. <script setup lang="ts">
  2. import { provide, computed, watch, onMounted } from 'vue'
  3. import { propTypes } from '@/utils/propTypes'
  4. import { ElConfigProvider } from 'element-plus'
  5. import { useLocaleStore } from '@/store/modules/locale'
  6. import { useWindowSize } from '@vueuse/core'
  7. import { useAppStore } from '@/store/modules/app'
  8. import { setCssVar } from '@/utils'
  9. import { useDesign } from '@/hooks/web/useDesign'
  10. const { variables } = useDesign()
  11. const appStore = useAppStore()
  12. const props = defineProps({
  13. size: propTypes.oneOf<ElementPlusSize>(['default', 'small', 'large']).def('default')
  14. })
  15. provide('configGlobal', props)
  16. // 初始化所有主题色
  17. onMounted(() => {
  18. appStore.setCssVarTheme()
  19. })
  20. const { width } = useWindowSize()
  21. // 监听窗口变化
  22. watch(
  23. () => width.value,
  24. (width: number) => {
  25. if (width < 768) {
  26. !appStore.getMobile ? appStore.setMobile(true) : undefined
  27. setCssVar('--left-menu-min-width', '0')
  28. appStore.setCollapse(true)
  29. appStore.getLayout !== 'classic' ? appStore.setLayout('classic') : undefined
  30. } else {
  31. appStore.getMobile ? appStore.setMobile(false) : undefined
  32. setCssVar('--left-menu-min-width', '64px')
  33. }
  34. },
  35. {
  36. immediate: true
  37. }
  38. )
  39. // 多语言相关
  40. const localeStore = useLocaleStore()
  41. const currentLocale = computed(() => localeStore.currentLocale)
  42. </script>
  43. <template>
  44. <ElConfigProvider
  45. :namespace="variables.elNamespace"
  46. :locale="currentLocale.elLocale"
  47. :message="{ max: 1 }"
  48. :size="size"
  49. >
  50. <slot></slot>
  51. </ElConfigProvider>
  52. </template>