SidebarItem.vue 5.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. <template>
  2. <div v-if="!item.hidden&&item.children" class="menu-wrapper">
  3. <!-- <router-link v-if="hasOneShowingChild(item.children) && !onlyOneChild.children&&!item.alwaysShow" :to="resolvePath(onlyOneChild.path)">
  4. <el-menu-item :index="resolvePath(onlyOneChild.path)" :class="{'submenu-title-noDropdown':!isNest}">
  5. <svg-icon v-if="onlyOneChild.meta&&onlyOneChild.meta.icon" :icon-class="onlyOneChild.meta.icon"></svg-icon>
  6. <span v-if="onlyOneChild.meta&&onlyOneChild.meta.title" slot="title">{{generateTitle(onlyOneChild.meta.title)}}</span>
  7. </el-menu-item>
  8. </router-link>
  9. <el-submenu v-else :index="item.name||item.path">
  10. <template slot="title">
  11. <svg-icon v-if="item.meta&&item.meta.icon" :icon-class="item.meta.icon"></svg-icon>
  12. <span v-if="item.meta&&item.meta.title" slot="title">{{generateTitle(item.meta.title)}}</span>
  13. </template>
  14. <template v-for="child in item.children" v-if="!child.hidden">
  15. <sidebar-item :is-nest="true" class="nest-menu" v-if="child.children&&child.children.length>0" :item="child" :key="child.path" :base-path="resolvePath(child.path)"></sidebar-item>
  16. <template v-else>
  17. <el-menu-item v-if="child.unfinished == true" :key="child.name" @click.native="unfinishAction()" :index="resolvePath(child.path)">
  18. <svg-icon v-if="child.meta&&child.meta.icon" :icon-class="child.meta.icon"></svg-icon>
  19. <span v-if="child.meta&&child.meta.title" slot="title">{{generateTitle(child.meta.title)}}</span>
  20. </el-menu-item>
  21. <router-link v-else :to="resolvePath(child.path)" :key="child.name">
  22. <el-menu-item :index="resolvePath(child.path)">
  23. <svg-icon v-if="child.meta&&child.meta.icon" :icon-class="child.meta.icon"></svg-icon>
  24. <span v-if="child.meta&&child.meta.title" slot="title">{{generateTitle(child.meta.title)}}</span>
  25. </el-menu-item>
  26. </router-link>
  27. </template>
  28. </template>
  29. </el-submenu> -->
  30. <div v-if="hasOneShowingChild(item.children) && !onlyOneChild.children && !item.alwaysShow" @click="onClick(item)">
  31. <router-link :to="resolvePath(onlyOneChild.path)">
  32. <el-menu-item :index="resolvePath(onlyOneChild.path)" :class="{ 'submenu-title-noDropdown': !isNest }">
  33. <svg-icon v-if="onlyOneChild.meta && onlyOneChild.meta.icon" :icon-class="onlyOneChild.meta.icon"></svg-icon>
  34. <span v-if="onlyOneChild.meta && onlyOneChild.meta.title" slot="title">{{ generateTitle(onlyOneChild.meta.title) }}</span>
  35. </el-menu-item>
  36. </router-link>
  37. </div>
  38. <div v-else @click="onClick(item)">
  39. <router-link :to="resolvePath(item.children[0].path)">
  40. <el-menu-item :index="item.path">
  41. <template slot="title">
  42. <svg-icon v-if="item.meta && item.meta.icon" :icon-class="item.meta.icon"></svg-icon>
  43. <span v-if="item.meta && item.meta.title" slot="title">
  44. {{ generateTitle(item.meta.title) }}
  45. </span>
  46. </template>
  47. </el-menu-item>
  48. </router-link>
  49. </div>
  50. </div>
  51. </template>
  52. <script>
  53. import path from 'path'
  54. import { generateTitle } from '@/utils/i18n'
  55. import { mapGetters } from "vuex";
  56. export default {
  57. name: 'SidebarItem',
  58. props: {
  59. // route object
  60. item: {
  61. type: Object,
  62. required: true
  63. },
  64. isNest: {
  65. type: Boolean,
  66. default: false
  67. },
  68. basePath: {
  69. type: String,
  70. default: ''
  71. }
  72. },
  73. computed: {
  74. ...mapGetters(["permission_routers"])
  75. },
  76. data() {
  77. return {
  78. onlyOneChild: null
  79. }
  80. },
  81. methods: {
  82. hasOneShowingChild(children) {
  83. const showingChildren = children.filter(item => {
  84. if (item.hidden) {
  85. return false
  86. } else {
  87. // temp set(will be used if only has one showing child )
  88. this.onlyOneChild = item
  89. return true
  90. }
  91. })
  92. if (showingChildren.length === 1) {
  93. return true
  94. }
  95. return false
  96. },
  97. resolvePath(...paths) {
  98. return path.resolve(this.basePath, ...paths)
  99. },
  100. generateTitle,
  101. unfinishAction: function() {
  102. this.$message.error("功能开发中")
  103. },
  104. onClick(index) {
  105. this.permission_routers.map((item, i) => {
  106. if (this.isObjectValueEqual(item, index)) {
  107. this.$emit("a", i);
  108. }
  109. });
  110. },
  111. isObjectValueEqual(a, b) {
  112. var aProps = Object.getOwnPropertyNames(a);
  113. var bProps = Object.getOwnPropertyNames(b);
  114. if (aProps.length != bProps.length) {
  115. return false;
  116. }
  117. for (var i = 0; i < aProps.length; i++) {
  118. var propName = aProps[i];
  119. if (a[propName] !== b[propName]) {
  120. return false;
  121. }
  122. }
  123. return true;
  124. }
  125. }
  126. }
  127. </script>
  128. <style lang="scss">
  129. .menu-wrapper{
  130. .el-menu-item{
  131. background-color:#1F2D3D !important;
  132. color: #fff !important;
  133. }
  134. .el-menu{
  135. background-color:#1F2D3D !important;
  136. }
  137. .el-submenu__title{
  138. background-color:#1F2D3D !important;
  139. color: #fff !important;
  140. height: 32px !important;
  141. line-height: 32px !important;
  142. }
  143. .router-link-exact-active{
  144. color: rgb(64, 158, 255) !important;
  145. .el-menu-item{
  146. color: rgb(64, 158, 255) !important;
  147. }
  148. }
  149. }
  150. </style>