Layout.vue 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. <script lang="tsx">
  2. import { computed, defineComponent, KeepAlive } from 'vue'
  3. import { useTagsViewStore } from '@/store/modules/tagsView'
  4. import { useAppStore } from '@/store/modules/app'
  5. import { Menu } from '@/components/Menu'
  6. import { Collapse } from '@/components/Collapse'
  7. import { LocaleDropdown } from '@/components/LocaleDropdown'
  8. import { SizeDropdown } from '@/components/SizeDropdown'
  9. import { UserInfo } from '@/components/UserInfo'
  10. import { Screenfull } from '@/components/Screenfull'
  11. import { Breadcrumb } from '@/components/Breadcrumb'
  12. import { TagsView } from '@/components/TagsView'
  13. const tagsViewStore = useTagsViewStore()
  14. const getCaches = computed((): string[] => {
  15. return tagsViewStore.getCachedViews
  16. })
  17. const appStore = useAppStore()
  18. const mobile = computed(() => appStore.getMobile)
  19. const collapse = computed(() => appStore.getCollapse)
  20. const classSuffix = computed(() => appStore.getLayout)
  21. const handleClickOutside = () => {
  22. appStore.setCollapse(true)
  23. }
  24. export default defineComponent({
  25. name: 'Layout',
  26. setup() {
  27. return () => (
  28. <section class={['v-app', `v-app__${classSuffix.value}`, 'w-[100%] h-[100%] relative']}>
  29. {mobile.value && !collapse.value ? (
  30. <div
  31. class="absolute top-0 left-0 w-full h-full opacity-30 z-99 bg-[var(--el-color-black)]"
  32. onClick={handleClickOutside}
  33. ></div>
  34. ) : undefined}
  35. <Menu class="absolute top-0 left-0"></Menu>
  36. <div
  37. class={[
  38. 'v-app-right',
  39. 'absolute top-0 h-[100%]',
  40. collapse.value
  41. ? 'w-[calc(100%-var(--left-menu-min-width))]'
  42. : 'w-[calc(100%-var(--left-menu-max-width))]',
  43. collapse.value
  44. ? 'left-[var(--left-menu-min-width)]'
  45. : 'left-[var(--left-menu-max-width)]',
  46. '<md:(!left-0 !w-[100%])'
  47. ]}
  48. >
  49. <div
  50. class={[
  51. 'v-app-right__tool',
  52. 'h-[var(--top-tool-height)] relative px-[var(--top-tool-p-x)] flex items-center justify-between'
  53. ]}
  54. >
  55. <div class="h-full flex items-center">
  56. <Collapse class="header__tigger"></Collapse>
  57. <Breadcrumb class="<md:hidden"></Breadcrumb>
  58. </div>
  59. <div class="h-full flex items-center">
  60. <Screenfull class="header__tigger"></Screenfull>
  61. <SizeDropdown class="header__tigger"></SizeDropdown>
  62. <LocaleDropdown class="header__tigger"></LocaleDropdown>
  63. <UserInfo class="header__tigger"></UserInfo>
  64. </div>
  65. </div>
  66. <div class="v-app-right__tags relative">
  67. <TagsView></TagsView>
  68. </div>
  69. <router-view>
  70. {{
  71. default: ({ Component, route }) => (
  72. <KeepAlive include={getCaches.value}>
  73. <Component is={Component} key={route.fullPath}></Component>
  74. </KeepAlive>
  75. )
  76. }}
  77. </router-view>
  78. </div>
  79. </section>
  80. )
  81. }
  82. })
  83. </script>
  84. <style lang="less" scoped>
  85. @prefix-cls: ~'@{namespace}-app';
  86. .header__tigger {
  87. display: flex;
  88. height: 100%;
  89. padding: 1px 10px 0;
  90. cursor: pointer;
  91. align-items: center;
  92. transition: background var(--transition-time-02);
  93. &:hover {
  94. background-color: #f6f6f6;
  95. }
  96. }
  97. .@{prefix-cls} {
  98. &-right {
  99. transition: left var(--transition-time-02);
  100. &__tool,
  101. &__tags {
  102. &::after {
  103. position: absolute;
  104. bottom: 0;
  105. left: 0;
  106. width: 100%;
  107. height: 1px;
  108. border-top: 1px solid var(--top-tool-border-color);
  109. content: '';
  110. }
  111. }
  112. }
  113. }
  114. </style>