index.vue 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. <template>
  2. <el-menu class="topbar-menu" :ellipsis="false" :default-active="activeMenu" :active-text-color="theme" mode="horizontal">
  3. <sidebar-item :key="route.path + index" v-for="(route, index) in topMenus" :item="route" :base-path="route.path" />
  4. <el-sub-menu index="more" class="el-sub-menu__hide-arrow" v-if="moreRoutes.length > 0">
  5. <template #title>
  6. <span>更多菜单</span>
  7. </template>
  8. <sidebar-item :key="route.path + index" v-for="(route, index) in moreRoutes" :item="route" :base-path="route.path" />
  9. </el-sub-menu>
  10. </el-menu>
  11. </template>
  12. <script setup>
  13. import SidebarItem from '../Sidebar/SidebarItem'
  14. import {useAppStore} from '@/store/modules/app'
  15. import {useSettingsStore} from '@/store/modules/settings'
  16. import {usePermissionStore} from '@/store/modules/permission'
  17. const route = useRoute()
  18. const appStore = useAppStore()
  19. const settingsStore = useSettingsStore()
  20. const permissionStore = usePermissionStore()
  21. const sidebarRouters = computed(() => permissionStore.sidebarRouters)
  22. const theme = computed(() => settingsStore.theme)
  23. const device = computed(() => appStore.device)
  24. const activeMenu = computed(() => {
  25. const { meta, path } = route
  26. if (meta.activeMenu) {
  27. return meta.activeMenu
  28. }
  29. return path
  30. })
  31. const visibleNumber = ref(5)
  32. const topMenus = computed(() => {
  33. return permissionStore.sidebarRouters.filter((f) => !f.hidden).slice(0, visibleNumber.value)
  34. })
  35. const moreRoutes = computed(() => {
  36. return permissionStore.sidebarRouters.filter((f) => !f.hidden).slice(visibleNumber.value, sidebarRouters.value.length - visibleNumber.value)
  37. })
  38. function setVisibleNumber() {
  39. let width = document.body.getBoundingClientRect().width
  40. if (width >= 1000) {
  41. width -= 500
  42. }
  43. visibleNumber.value = parseInt(width / 3 / 85)
  44. }
  45. onMounted(() => {
  46. window.addEventListener('resize', setVisibleNumber)
  47. })
  48. onBeforeUnmount(() => {
  49. window.removeEventListener('resize', setVisibleNumber)
  50. })
  51. onMounted(() => {
  52. setVisibleNumber()
  53. })
  54. </script>
  55. <style lang="scss">
  56. /* menu item */
  57. #app .topbar-menu.el-menu--horizontal .el-sub-menu__title, #app .topbar-menu.el-menu--horizontal .el-menu-item {
  58. padding: 0 10px !important;
  59. }
  60. .topbar-menu.el-menu--horizontal > .el-menu-item {
  61. float: left;
  62. height: 50px !important;
  63. line-height: 50px !important;
  64. color: #303133 !important;
  65. padding: 0 5px !important;
  66. margin: 0 10px !important;
  67. }
  68. .el-sub-menu.is-active .svg-icon, .el-menu-item.is-active .svg-icon + span, .el-sub-menu.is-active .svg-icon + span, .el-sub-menu.is-active .el-sub-menu__title span {
  69. color: v-bind(theme);
  70. }
  71. /* sub-menu item */
  72. .topbar-menu.el-menu--horizontal > .el-sub-menu .el-sub-menu__title {
  73. float: left;
  74. line-height: 50px !important;
  75. color: #303133 !important;
  76. margin: 0 15px -3px!important;
  77. }
  78. /* topbar more arrow */
  79. .topbar-menu .el-sub-menu .el-sub-menu__icon-arrow {
  80. position: static;
  81. margin-left: 8px;
  82. margin-top: 0px;
  83. display: block !important;
  84. }
  85. /* menu__title el-menu-item */
  86. .topbar-menu.el-menu--horizontal .el-sub-menu__title, .topbar-menu.el-menu--horizontal .el-menu-item {
  87. height: 60px;
  88. }
  89. </style>