index.vue 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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. const width = document.body.getBoundingClientRect().width / 3
  40. visibleNumber.value = parseInt(width / 85)
  41. }
  42. onMounted(() => {
  43. window.addEventListener('resize', setVisibleNumber)
  44. })
  45. onBeforeUnmount(() => {
  46. window.removeEventListener('resize', setVisibleNumber)
  47. })
  48. onMounted(() => {
  49. setVisibleNumber()
  50. })
  51. </script>
  52. <style lang="scss">
  53. .topbar-menu.el-menu--horizontal > .el-menu-item {
  54. float: left;
  55. height: 50px !important;
  56. line-height: 50px !important;
  57. color: #303133 !important;
  58. padding: 0 5px !important;
  59. margin: 0 10px !important;
  60. }
  61. .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 {
  62. color: v-bind(theme);
  63. }
  64. /* sub-menu item */
  65. .topbar-menu.el-menu--horizontal > .el-sub-menu .el-sub-menu__title {
  66. float: left;
  67. height: 62px !important;
  68. line-height: 50px !important;
  69. color: #303133 !important;
  70. padding: 0 5px !important;
  71. margin: 0 20px -4px!important;
  72. }
  73. /* 背景色隐藏 */
  74. .topbar-menu.el-menu--horizontal>.el-menu-item:not(.is-disabled):focus, .topbar-menu.el-menu--horizontal>.el-menu-item:not(.is-disabled):hover, .topbar-menu.el-menu--horizontal>.el-submenu .el-submenu__title:hover {
  75. background-color: #ffffff;
  76. }
  77. /* 图标右间距 */
  78. .topbar-menu .svg-icon {
  79. margin-right: 4px;
  80. }
  81. /* topbar more arrow */
  82. .topbar-menu .el-sub-menu .el-sub-menu__icon-arrow {
  83. position: static;
  84. margin-left: 8px;
  85. margin-top: 0px;
  86. display: block !important;
  87. }
  88. /* menu__title el-menu-item */
  89. .topbar-menu.el-menu--horizontal .el-sub-menu__title, .topbar-menu.el-menu--horizontal .el-menu-item {
  90. height: 60px;
  91. }
  92. </style>