<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); } // 顶部导航的样式 .navbar { .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>