menu.vue 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. <script setup lang="ts">
  2. interface MenuItem {
  3. name: string;
  4. icon: string;
  5. route: string;
  6. }
  7. const menus = ref<MenuItem[]>([
  8. {
  9. name: "首页",
  10. icon: "home",
  11. route: "/main/home",
  12. },
  13. {
  14. name: "测试执行",
  15. icon: "run-test",
  16. route: "/main/run-test",
  17. },
  18. {
  19. name: "数据管理",
  20. icon: "data-manager",
  21. route: "/main/data-manager",
  22. },
  23. {
  24. name: "工程配置",
  25. icon: "project-config",
  26. route: "/main/project-config",
  27. },
  28. {
  29. name: "报告魔板",
  30. icon: "report-template",
  31. route: "/main/report-template",
  32. },
  33. {
  34. name: "人员管理",
  35. icon: "person-manager",
  36. route: "/main/person-manager",
  37. },
  38. ]);
  39. const currentMenu = ref<MenuItem>(menus.value[0]);
  40. const router = useRouter();
  41. const handleMenuClick = (menu: MenuItem) => {
  42. if (menu.route != currentMenu.value.route) {
  43. currentMenu.value = menu;
  44. router.push(menu.route);
  45. }
  46. };
  47. </script>
  48. <template>
  49. <div class="menu">
  50. <div
  51. class="menu-box"
  52. v-for="menu in menus"
  53. :key="menu.name"
  54. @click="handleMenuClick(menu)"
  55. >
  56. <!-- 这里的图标可以用可变色的svg 传过去一个color属性,然后根据当前路由的颜色来显示不同的颜色-->
  57. <svg-icon
  58. :icon-class="menu.icon"
  59. size="24"
  60. :style="{
  61. color: menu.route === currentMenu.route ? 'white' : '#AFB9D0',
  62. }"
  63. />
  64. <div
  65. class="name"
  66. :class="[menu.route === currentMenu.route ? 'selected' : 'normal']"
  67. >
  68. {{ menu.name }}
  69. </div>
  70. </div>
  71. </div>
  72. </template>
  73. <style scoped lang="scss">
  74. .menu {
  75. height: calc(100vh - $main-header-height);
  76. width: 79px;
  77. display: flex;
  78. flex-direction: column;
  79. justify-content: start;
  80. align-items: center;
  81. padding: 12px 6px;
  82. background-color: $hj-black-3;
  83. .menu-box {
  84. width: 64px;
  85. height: 64px;
  86. display: flex;
  87. flex-direction: column;
  88. justify-content: center;
  89. align-items: center;
  90. margin-bottom: 12px;
  91. .name {
  92. margin-top: 10px;
  93. font-weight: bold;
  94. font-size: 12px;
  95. line-height: 19px;
  96. text-align: center;
  97. }
  98. .normal {
  99. color: #afb9d0;
  100. }
  101. .selected {
  102. color: $hj-white-1;
  103. }
  104. }
  105. }
  106. </style>