merchant-web/src/views/main-sidebar.vue

187 lines
5.3 KiB
Vue

<template>
<aside class="site-sidebar" :class="'site-sidebar--' + sidebarLayoutSkin">
<div class="site-sidebar__inner">
<el-menu
:default-active="menuActiveName || 'home'"
:collapse="sidebarFold"
:collapseTransition="false"
class="site-sidebar__menu"
>
<el-input
v-show="showSearchInput"
class="search-input"
v-model="keyWord"
style="width"
placeholder="快速搜索菜单"
></el-input>
<el-menu-item index="home" @click="$router.push({ name: 'home' })">
<icon-svg name="shouye" class="site-sidebar__menu-icon"></icon-svg>
<span slot="title">首页</span>
</el-menu-item>
<!-- <el-submenu index="demo">
<template slot="title">
<icon-svg name="shoucang" class="site-sidebar__menu-icon"></icon-svg>
<span>demo</span>
</template>
<el-menu-item index="demo-echarts" @click="$router.push({ name: 'demo-echarts' })">
<icon-svg name="tubiao" class="site-sidebar__menu-icon"></icon-svg>
<span slot="title">echarts</span>
</el-menu-item>
<el-menu-item index="demo-ueditor" @click="$router.push({ name: 'demo-ueditor' })">
<icon-svg name="editor" class="site-sidebar__menu-icon"></icon-svg>
<span slot="title">ueditor</span>
</el-menu-item>
</el-submenu> -->
<sub-menu
v-for="menu in filterMenu"
:key="menu.menuId"
:menu="menu"
:dynamicMenuRoutes="dynamicMenuRoutes"
>
</sub-menu>
</el-menu>
</div>
</aside>
</template>
<script>
import SubMenu from "./main-sidebar-sub-menu";
import { isURL } from "@/utils/validate";
export default {
data() {
return {
dynamicMenuRoutes: [],
//菜单搜索关键词
keyWord: "",
};
},
components: {
SubMenu,
},
computed: {
sidebarLayoutSkin: {
get() {
return this.$store.state.common.sidebarLayoutSkin;
},
},
sidebarFold: {
get() {
return this.$store.state.common.sidebarFold;
},
},
menuList: {
get() {
return this.$store.state.common.menuList;
},
set(val) {
this.$store.commit("common/updateMenuList", val);
},
},
menuActiveName: {
get() {
return this.$store.state.common.menuActiveName;
},
set(val) {
this.$store.commit("common/updateMenuActiveName", val);
},
},
mainTabs: {
get() {
return this.$store.state.common.mainTabs;
},
set(val) {
this.$store.commit("common/updateMainTabs", val);
},
},
mainTabsActiveName: {
get() {
return this.$store.state.common.mainTabsActiveName;
},
set(val) {
this.$store.commit("common/updateMainTabsActiveName", val);
},
},
//过滤后的菜单
filterMenu() {
//过滤的方法
const filterMethod = (list, keyWord) => {
return list.filter(function f(item) {
if (item.name.includes(keyWord)) return true;
if (item.list && item.list.length > 0) {
//此处的目的是至展示有的菜单
return (item.list = item.list.filter(f)).length;
}
});
};
let filterMenu = filterMethod(
JSON.parse(JSON.stringify(this.menuList)),
this.keyWord
);
console.log(filterMenu, "filterMenu");
return filterMenu.filter((item) => {
item.list = item.list.filter((prop) => prop.hideInMenu != true);
return item.hideInMenu != true;
});
},
//是否展示菜单搜索界面
showSearchInput() {
return this.$store.state.common.sidebarFold == false;
},
},
watch: {
$route: "routeHandle",
},
created() {
this.menuList = JSON.parse(sessionStorage.getItem("menuList") || "[]");
this.dynamicMenuRoutes = JSON.parse(
sessionStorage.getItem("dynamicMenuRoutes") || "[]"
);
this.routeHandle(this.$route);
},
methods: {
// 路由操作
routeHandle(route) {
if (route.meta.isTab) {
// tab选中, 不存在先添加
var tab = this.mainTabs.filter((item) => item.name === route.name)[0];
if (!tab) {
if (route.meta.isDynamic) {
route = this.dynamicMenuRoutes.filter(
(item) => item.name === route.name
)[0];
if (!route) {
return console.error("未能找到可用标签页!");
}
}
tab = {
menuId: route.meta.menuId || route.name,
name: route.name,
title: route.meta.title,
type: route.meta.isMicroApp
? "microApp"
: isURL(route.meta.iframeUrl)
? "iframe"
: "module",
iframeUrl: route.meta.iframeUrl || "",
params: route.params,
query: route.query,
};
this.mainTabs = this.mainTabs.concat(tab);
}
this.menuActiveName = tab.menuId + "";
this.mainTabsActiveName = tab.name;
}
},
},
};
</script>
<style lang="scss" scoped>
.search-input {
position: sticky;
top: 0;
background: #fff;
z-index: 99;
padding: 10px 15px 0 15px;
}
</style>