NavBar.vue 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. <template>
  2. <div class="menu-bar-container">
  3. <!-- logo -->
  4. <div
  5. class="logo flex a-c j-c"
  6. :style="{'background-color':themeColor}"
  7. :class="collapse?'menu-bar-collapse-width':'menu-bar-width'"
  8. @click="$router.push('/')"
  9. >
  10. <img v-if="collapse" src="@/assets/image/logo.png" />
  11. <div v-if="!collapse" class="flex j-c a-c">
  12. <img src="@/assets/image/logo.png" />
  13. <span>{{appName}}</span>
  14. </div>
  15. </div>
  16. <!-- 导航菜单 -->
  17. <el-menu
  18. ref="navmenu"
  19. :default-active="menuIndex"
  20. :class="collapse?'menu-bar-collapse-width':'menu-bar-width'"
  21. :collapse="collapse"
  22. :collapse-transition="false"
  23. :unique-opened="true"
  24. @open="handleopen"
  25. @close="handleclose"
  26. @select="handleselect"
  27. background-color="#393D49"
  28. text-color="#fff"
  29. active-text-color="#fff"
  30. >
  31. <!-- 导航菜单树组件,动态加载菜单 -->
  32. <menu-tree v-for="item in leftTree" :key="item.id" :menu="item"></menu-tree>
  33. </el-menu>
  34. </div>
  35. </template>
  36. <script>
  37. import { mapState } from "vuex";
  38. import MenuTree from "@/components/MenuTree";
  39. export default {
  40. components: {
  41. MenuTree
  42. },
  43. computed: {
  44. ...mapState({
  45. appName: state => state.app.appName,
  46. themeColor: state => state.app.themeColor,
  47. collapse: state => state.app.collapse,
  48. navTree: state => state.menu.navTree,
  49. leftTree: state => state.menu.leftTree
  50. }),
  51. mainTabs: {
  52. get() {
  53. return this.$store.state.tab.mainTabs;
  54. },
  55. set(val) {
  56. this.$store.commit("updateMainTabs", val);
  57. }
  58. },
  59. mainTabsActiveName: {
  60. get() {
  61. return this.$store.state.tab.mainTabsActiveName;
  62. },
  63. set(val) {
  64. this.$store.commit("updateMainTabsActiveName", val);
  65. }
  66. }
  67. },
  68. watch: {
  69. $route: "handleRoute"
  70. },
  71. data(){
  72. return{
  73. menuIndex: this.$route.meta.index!==0?this.$route.meta.index:this.leftTree[0].id
  74. }
  75. },
  76. created() {
  77. this.handleRoute(this.$route);
  78. },
  79. methods: {
  80. handleopen() {},
  81. handleclose() {},
  82. handleselect(a, b) {},
  83. // 路由操作处理
  84. handleRoute(route) {
  85. // tab标签页选中, 如果不存在则先添加
  86. var tab = this.mainTabs.filter(item => item.name === route.name)[0];
  87. if (!tab) {
  88. tab = {
  89. name: route.name,
  90. title: route.name,
  91. icon: route.meta.icon
  92. };
  93. this.mainTabs = this.mainTabs.concat(tab);
  94. }
  95. this.mainTabsActiveName = tab.name;
  96. // 切换标签页时同步更新高亮菜单
  97. if (this.$refs.navmenu != null) {
  98. this.$refs.navmenu.activeIndex = "" + route.meta.index;
  99. this.$refs.navmenu.initOpenedMenu();
  100. }
  101. }
  102. }
  103. };
  104. </script>
  105. <style scoped lang="scss">
  106. .menu-bar-container {
  107. position: fixed;
  108. top: 0px;
  109. left: 0;
  110. bottom: 0;
  111. z-index: 1020;
  112. .el-menu {
  113. position: absolute;
  114. top: 60px;
  115. bottom: 0px;
  116. text-align: left;
  117. }
  118. .logo {
  119. position: absolute;
  120. top: 0px;
  121. height: 60px;
  122. line-height: 60px;
  123. background: #545c64;
  124. cursor: pointer;
  125. img {
  126. width: 40px;
  127. height: 40px;
  128. border-radius: 0px;
  129. margin-right: 10px;
  130. float: left;
  131. }
  132. div {
  133. font-size: 25px;
  134. color: white;
  135. text-align: left;
  136. }
  137. }
  138. .menu-bar-width {
  139. width: 220px;
  140. overflow-y: auto;
  141. }
  142. .menu-bar-collapse-width {
  143. width: 65px;
  144. }
  145. }
  146. </style>