<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, onlyOneChild.query)" > <el-menu-item :index="resolvePath(onlyOneChild.path)" :class="{ 'submenu-title-noDropdown': !isNest }" > <svg-icon :icon-class=" onlyOneChild.meta.icon || (item.meta && item.meta.icon) " /> <template #title ><span class="menu-title" :title="hasTitle(onlyOneChild.meta.title)" >{{ onlyOneChild.meta.title }}</span ></template > </el-menu-item> </app-link> </template> <el-sub-menu v-else ref="subMenu" :index="resolvePath(item.path)" popper-append-to-body > <template v-if="item.meta" #title> <svg-icon :icon-class="item.meta && item.meta.icon" /> <span class="menu-title" :title="hasTitle(item.meta.title)">{{ item.meta.title }}</span> </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-sub-menu> </div> </template> <script setup> import { isExternal } from "@/utils/validate"; import AppLink from "./Link"; import { getNormalPath } from "@/utils/ruoyi"; const props = defineProps({ // route object item: { type: Object, required: true, }, isNest: { type: Boolean, default: false, }, basePath: { type: String, default: "", }, }); const onlyOneChild = ref({}); function 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) onlyOneChild.value = 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) { onlyOneChild.value = { ...parent, path: "", noShowingChildren: true }; return true; } return false; } function resolvePath(routePath, routeQuery) { if (isExternal(routePath)) { return routePath; } if (isExternal(props.basePath)) { return props.basePath; } if (routeQuery) { let query = JSON.parse(routeQuery); return { path: getNormalPath(props.basePath + "/" + routePath), query: query, }; } return getNormalPath(props.basePath + "/" + routePath); } function hasTitle(title) { if (title.length > 5) { return title; } else { return ""; } } </script>