<template> <div v-if="!item.hidden" > <!-- 最后一级菜单 --> <el-menu-item v-if="isHaveOneChild(item.children,item) && (!onlyOneChild.children||onlyOneChild.noShowingChildren)" :index="resolvePath(onlyOneChild.path)" > <IconFont :icon="onlyOneChild.meta.icon||(item.meta&&item.meta.icon)" class="menu-drawer-icon" size="18px"/> <span slot="title">{{onlyOneChild.meta.title}} </span> </el-menu-item> <!-- 此菜单下还有子菜单 --> <el-submenu v-else :popper-append-to-body="false" :index="resolvePath(item.path)" > <template slot="title"> <IconFont :icon="item.meta && item.meta.icon" class="menu-drawer-icon" size="18px"/> <span>{{item.meta.title}}</span> </template> <!-- 递归 --> <sidebar-item v-for="(child,number) in item.children" :key="number" :item="child" :basePath="resolvePath(child.path)" /> </el-submenu> </div> </template> <script> import path from 'path' export default { name: "SidebarItem", //使用场景:允许组件模板递归地调用自身 props: { "item":{ type: Object, required: true }, "basePath":{ type: String, default: '' } }, data() { this.onlyOneChild = null return { // onlyOneChild: null }; }, methods: { isHaveOneChild(children = [], parent) { 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){ // console.log('studyGit-basePath',this.basePath) // console.log('studyGit-routePath',routePath) // console.log('studyGit-后的路径',path.resolve(this.basePath, routePath)) return path.resolve(this.basePath, routePath); } } }; </script>