You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

169 lines
4.4 KiB

<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 }"
>
<!-- :title="onlyOneChild.meta.title" -->
<item
:icon="onlyOneChild.meta.icon || (item.meta && item.meta.icon)"
:is-nest="isNest"
:menu-key="resolvePath(onlyOneChild.path)"
:nav-key="titleFn(onlyOneChild.meta.title)"
/>
<!-- title 具名插槽:收起模式下 Element 依赖它渲染悬浮名称;
title 原生属性:文字被省略号截断时悬浮显示全称 -->
<span slot="title" class="menu-item-title" :title="titleFn(onlyOneChild.meta.title)">{{ titleFn(onlyOneChild.meta.title) }}</span>
</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"
:is-nest="isNest"
:menu-key="resolvePath(item.path)"
:title="titleFn(item.meta.title, item.children)"
>
</item>
</template>
<sidebar-item
v-for="(child, index) in item.children"
:key="child.path + index"
:is-nest="true"
:item="child"
:base-path="resolvePath(child.path)"
class="nest-menu"
>
</sidebar-item>
</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;
}
// 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, routeQuery) {
if (isExternal(routePath)) {
return routePath;
}
if (isExternal(this.basePath)) {
return this.basePath;
}
if (routeQuery) {
let query = JSON.parse(routeQuery);
return { path: path.resolve(this.basePath, routePath), query: query };
}
return path.resolve(this.basePath, routePath);
},
titleFn(item, children) {
let str = "";
let lang = localStorage.getItem("language");
if (item.includes("|")) {
if (lang == "en_US") {
str = item.split("|")[1];
} else {
str = item.split("|")[0];
}
} else {
str = item;
}
if (children) {
children.forEach((i) => {
if (i.meta && i.meta.title) {
if (i.meta.title.includes("|")) {
if (lang == "en_US") {
i.meta.title = i.meta.title.split("|")[1];
} else {
i.meta.title = i.meta.title.split("|")[0];
}
} else {
i.meta.title = i.meta.title;
}
}
});
}
if(item=="首页"){
if (lang == "en_US") {
str = "Home";
} else {
str = "首页";
}
}
return str;
}
},
};
</script>