SiderBar.vue 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. <template>
  2. <el-aside class="siderbar_container" :width="isCollapse ? '72px' : '150px'">
  3. <div @click="toggleCollapse" class="collapse_box">
  4. <img v-if="isCollapse" src="@/assets/icon/open.svg" alt="">
  5. <img v-else src="@/assets/icon/close.svg" alt="">
  6. </div>
  7. <el-menu :collapse="isCollapse" router>
  8. <el-menu-item v-for="item in menuItems" :key="item.route" :index="item.route" :class="activeRoute == item.route ? 'is-active' : ''" >
  9. <template #default>
  10. <i class="iconfont" :class="item.icon"></i>
  11. <span v-if="!isCollapse">{{ item.title }}</span>
  12. </template>
  13. <template #title>
  14. <span v-if="isCollapse">{{ item.title }}</span>
  15. </template>
  16. </el-menu-item>
  17. </el-menu>
  18. </el-aside>
  19. </template>
  20. <script lang="ts">
  21. export default {
  22. name: 'SiderBar'
  23. }
  24. </script>
  25. <script lang="ts" setup>
  26. import { ref, watch, onMounted } from 'vue';
  27. import { useRoute } from 'vue-router'
  28. import router from '@/router';
  29. const route = useRoute()
  30. const activeRoute = ref(route.path)
  31. watch(() => route.path, (newVal) => {
  32. activeRoute.value = newVal
  33. })
  34. const isCollapse = ref(false)
  35. interface menuItem {
  36. label: string;
  37. icon: string;
  38. route: string;
  39. }
  40. const menuItems = ref<menuItem[]>()
  41. onMounted(() => {
  42. const menuListStr = localStorage.getItem('menuList')
  43. console.log(menuListStr)
  44. if (menuListStr) {
  45. menuItems.value = JSON.parse(menuListStr)
  46. // router.push(menuItems.value[0].route)
  47. }
  48. console.log(menuItems.value)
  49. });
  50. const toggleCollapse = () => {
  51. isCollapse.value = !isCollapse.value
  52. }
  53. </script>
  54. <style lang="scss" scoped>
  55. .siderbar_container {
  56. background: #fff;
  57. padding: 16px;
  58. }
  59. .el-menu {
  60. width: 100%;
  61. border: none;
  62. }
  63. .el-menu-item {
  64. padding: 0;
  65. }
  66. .iconfont {
  67. margin-right: 5px;
  68. display: inline-block;
  69. color: #666666;
  70. font-size: 20px;
  71. }
  72. .collapse_box {
  73. padding-left: 10px;
  74. // text-align: center;
  75. }
  76. .el-menu.el-menu--vertical :deep(.el-menu-item) {
  77. height: 40px;
  78. margin: 10px 0;
  79. padding: 0 10px;
  80. border-radius: 4px;
  81. .iconfont {
  82. margin-right: 8px;
  83. text-align: center;
  84. }
  85. }
  86. .el-menu--collapse .el-menu-item span {
  87. display: none;
  88. }
  89. .el-menu-item :deep(.el-menu-tooltip__trigger) {
  90. padding: 0 10px;
  91. }
  92. .el-menu-item {
  93. &.is-active,
  94. &.is-active:hover {
  95. background: #2E64FA;
  96. color: #fff;
  97. .iconfont {
  98. color: #fff;
  99. }
  100. }
  101. &:not(.is-active):hover {
  102. background: inherit;
  103. color: #2E64FA;
  104. .iconfont {
  105. color: #2E64FA;
  106. }
  107. }
  108. }
  109. </style>