<template> <div v-if="!item.hidden"> <template v-if="hasOneShowingChild(item.children,item) && (!onlyOneChild.children||onlyOneChild.noShowingChildren)&&!item.alwaysShow"> <app-link v-if="onlyOneChild.meta" :to="resolvePath(onlyOneChild.path)"> <el-menu-item :index="resolvePath(onlyOneChild.path)" :class="{'submenu-title-noDropdown':!isNest}"> <item :icon="onlyOneChild.meta.icon||(item.meta&&item.meta.icon)"/><br> <!-- <item :title="onlyOneChild.meta.title" /> --> {{onlyOneChild.meta.title}} </el-menu-item> </app-link> </template> <el-submenu v-else ref="subMenu" :index="resolvePath(item.path)" popper-append-to-body> <template slot="title"> <item v-if="item.meta" :icon="item.meta && item.meta.icon" :title="item.meta.title" /> </template> <sidebar-item v-for="child in item.children" :key="child.path" :is-nest="true" :item="child" :base-path="resolvePath(child.path)" class="nest-menu" /> </el-submenu> </div> </template> <script> import path from 'path' import { isExternal } from '@/utils/validate' import Item from './Item' import AppLink from './Link' import FixiOSBug from './FixiOSBug' export default { name: 'SidebarItem', components: { Item, AppLink }, mixins: [FixiOSBug], props: { // route object item: { type: Object, required: true }, isNest: { type: Boolean, default: false }, basePath: { type: String, default: '' } }, data() { this.onlyOneChild = null return {} }, methods: { hasOneShowingChild(children = [], parent) { if (!children) { children = []; } const showingChildren = children.filter(item => { if (item.hidden) { return false } else { // Temp set(will be used if only has one showing child) this.onlyOneChild = item return true } }) // When there is only one child router, the child router is displayed by default if (showingChildren.length === 1) { return true } // Show parent if there are no child router to display if (showingChildren.length === 0) { this.onlyOneChild = { ... parent, path: '', noShowingChildren: true } return true } return false }, resolvePath(routePath) { if (isExternal(routePath)) { return routePath } if (isExternal(this.basePath)) { return this.basePath } return path.resolve(this.basePath, routePath) } } } </script> <style lang="scss"> #app .sidebar-container .submenu-title-noDropdown:hover, #app .sidebar-container .el-submenu__title:hover { /* box-shadow: inset 2px 2px 20px #5CD9D4; */ background: rgba(0, 0, 0, 0); } #app .sidebar-container .el-menu-item, #app .sidebar-container .el-submenu__title { overflow: hidden !important; text-overflow: ellipsis !important; background: rgba(0, 0, 0, 0); } .el-menu-item:hover { outline: none; background-image: url("../../../assets/logo/item-background.png"); background-repeat: no-repeat; background-size: 100% 100%; /* background: rgba(0, 0, 0, 0); */ color: #31EAEA !important; } .el-menu-item:focus,.is-active { outline: none; background-image: url("../../../assets/logo/item-background.png"); background-repeat: no-repeat; background-size: 100% 100%; /* background: rgba(0, 0, 0, 0); */ color: #31EAEA !important; } .el-menu--horizontal > .el-submenu .el-submenu__title:hover { background-color: rgba(0, 0, 0, 0); color: #fff; background-image: url("../../../assets/logo/item-background.png"); background-repeat: no-repeat; background-size: 100% 100%; } .el-menu--horizontal > .el-submenu .el-submenu__title { height: 50px !important; line-height: 50px !important; margin-top: 15px; font-size: 22px; font-weight: 600; color: #fff; } .el-menu--horizontal > .el-submenu:focus .el-submenu__title, .el-menu--horizontal > .el-submenu:hover .el-submenu__title { color: #fff; } .el-menu--horizontal > .el-submenu.is-active .el-submenu__title { border-bottom: 0px solid; color: #fff; } .el-submenu__title i { color: #fff; } .el-menu--horizontal .el-menu .el-menu-item, .el-menu--horizontal .el-menu .el-submenu__title { background-color: #053B6A; float: none; height: 36px; line-height: 36px; padding: 0; color: #fff; } .el-menu--popup { z-index: 100; min-width: 120px; border: none; padding: 5px; border-radius: 2px; -webkit-box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%); box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%); background-color: #053B6A; } </style>