SidebarItem.vue 5.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. <template>
  2. <div v-if="!item.hidden && item.children" class="menu-wrapper">
  3. <div
  4. v-if="
  5. hasOneShowingChild(item.children) &&
  6. !onlyOneChild.children &&
  7. !item.alwaysShow
  8. "
  9. @click="onClick(item)"
  10. >
  11. <router-link :to="resolvePath(onlyOneChild.path)">
  12. <el-menu-item
  13. :index="resolvePath(onlyOneChild.path)"
  14. :class="{ 'submenu-title-noDropdown': !isNest }"
  15. >
  16. <svg-icon
  17. v-if="onlyOneChild.meta && onlyOneChild.meta.icon"
  18. :icon-class="onlyOneChild.meta.icon"
  19. ></svg-icon>
  20. <span
  21. v-if="onlyOneChild.meta && onlyOneChild.meta.title"
  22. slot="title"
  23. >{{ generateTitle(onlyOneChild.meta.title) }}</span>
  24. </el-menu-item>
  25. </router-link>
  26. </div>
  27. <div v-else>
  28. <el-submenu v-if="item.meta.isChild" id="mySubmenu" :index="item.name || item.path">
  29. <template slot="title">
  30. <svg-icon v-if="item.meta && item.meta.icon" :icon-class="item.meta.icon"></svg-icon>
  31. <span v-if="item.meta && item.meta.title" slot="title">
  32. {{
  33. generateTitle(item.meta.title)
  34. }}
  35. </span>
  36. </template>
  37. <template v-for="child in item.children" v-if="!child.hidden">
  38. <router-link
  39. :to="resolvePath(child.path)"
  40. v-if="child.meta.isChild != true"
  41. :key="child.name"
  42. >
  43. <el-menu-item @click="onClick(item)" :index="resolvePath(child.path)">
  44. <svg-icon v-if="child.meta && child.meta.icon" :icon-class="child.meta.icon"></svg-icon>
  45. <span v-if="child.meta && child.meta.title" slot="title">
  46. {{
  47. generateTitle(child.meta.title)
  48. }}
  49. </span>
  50. </el-menu-item>
  51. </router-link>
  52. <router-link v-else :to="child.path" :key="child.name">
  53. <el-menu-item @click="onClick(item,child.parentNum)" :index="resolvePath(child.path)">
  54. <svg-icon v-if="child.meta && child.meta.icon" :icon-class="child.meta.icon"></svg-icon>
  55. <span v-if="child.meta && child.meta.title" slot="title">
  56. {{
  57. generateTitle(child.meta.title)
  58. }}
  59. </span>
  60. </el-menu-item>
  61. </router-link>
  62. </template>
  63. </el-submenu>
  64. <div v-else @click="onClick(item)">
  65. <router-link :to="resolvePath(item.children[0].path)">
  66. <el-menu-item :index="item.name || item.path">
  67. <template slot="title">
  68. <svg-icon v-if="item.meta && item.meta.icon" :icon-class="item.meta.icon"></svg-icon>
  69. <span v-if="item.meta && item.meta.title" slot="title">
  70. {{
  71. generateTitle(item.meta.title)
  72. }}
  73. </span>
  74. </template>
  75. <!-- <template v-for="child in item.children" v-if="!child.hidden">
  76. <sidebar-item
  77. :is-nest="true"
  78. class="nest-menu"
  79. v-if="child.children && child.children.length > 0"
  80. :item="child"
  81. :key="child.path"
  82. :base-path="resolvePath(child.path)"
  83. ></sidebar-item>
  84. <router-link v-else :to="resolvePath(child.path)" :key="child.name">
  85. <el-menu-item :index="resolvePath(child.path)">
  86. <svg-icon
  87. v-if="child.meta && child.meta.icon"
  88. :icon-class="child.meta.icon"
  89. ></svg-icon>
  90. <span v-if="child.meta && child.meta.title" slot="title">{{
  91. generateTitle(child.meta.title)
  92. }}</span>
  93. </el-menu-item>
  94. </router-link>
  95. </template>-->
  96. </el-menu-item>
  97. </router-link>
  98. </div>
  99. </div>
  100. </div>
  101. </template>
  102. <script>
  103. import path from "path";
  104. import { generateTitle } from "@/utils/i18n";
  105. import { mapGetters } from "vuex";
  106. export default {
  107. name: "SidebarItem",
  108. props: {
  109. // route object
  110. item: {
  111. type: Object,
  112. required: true
  113. },
  114. isNest: {
  115. type: Boolean,
  116. default: false
  117. },
  118. basePath: {
  119. type: String,
  120. default: ""
  121. },
  122. index: {
  123. type: Number
  124. }
  125. },
  126. computed: {
  127. ...mapGetters(["permission_routers"])
  128. },
  129. data() {
  130. return {
  131. onlyOneChild: null
  132. };
  133. },
  134. methods: {
  135. hasOneShowingChild(children) {
  136. const showingChildren = children.filter(item => {
  137. if (item.hidden) {
  138. return false;
  139. } else {
  140. // temp set(will be used if only has one showing child )
  141. this.onlyOneChild = item;
  142. return true;
  143. }
  144. });
  145. if (showingChildren.length === 1) {
  146. return true;
  147. }
  148. return false;
  149. },
  150. resolvePath(...paths) {
  151. return path.resolve(this.basePath, ...paths);
  152. },
  153. generateTitle,
  154. onClick(index, num) {
  155. this.permission_routers.map((item, i) => {
  156. if (this.isObjectValueEqual(item, index)) {
  157. if (num) {
  158. this.$emit("a", i, num);
  159. } else {
  160. this.$emit("a", i, 999);
  161. }
  162. }
  163. });
  164. },
  165. isObjectValueEqual(a, b) {
  166. var aProps = Object.getOwnPropertyNames(a);
  167. var bProps = Object.getOwnPropertyNames(b);
  168. if (aProps.length != bProps.length) {
  169. return false;
  170. }
  171. for (var i = 0; i < aProps.length; i++) {
  172. var propName = aProps[i];
  173. if (a[propName] !== b[propName]) {
  174. return false;
  175. }
  176. }
  177. return true;
  178. }
  179. },
  180. created() {}
  181. };
  182. </script>
  183. <style lang="scss">
  184. #mySubmenu {
  185. .el-menu {
  186. display: flex;
  187. flex-wrap: wrap;
  188. > a {
  189. width: 50% !important;
  190. }
  191. .el-menu-item {
  192. min-width: 0;
  193. padding: 0 5px !important;
  194. font-size: 12px;
  195. background-color:#1F2D3D !important;
  196. }
  197. }
  198. }
  199. .el-menu-item{
  200. background-color:#1F2D3D !important;
  201. }
  202. .el-menu{
  203. background-color:#1F2D3D !important;
  204. }
  205. .el-submenu__title{
  206. background-color:#1F2D3D !important;
  207. }
  208. </style>