10 changed files with 343 additions and 95 deletions
@ -0,0 +1,108 @@ |
|||||
|
<template> |
||||
|
<el-menu class="topbar-menu" :default-active="activeMenu" :active-text-color="theme" mode="horizontal"> |
||||
|
<sidebar-item :key="route.path + index" v-for="(route, index) in topMenus" :item="route" :base-path="route.path" /> |
||||
|
|
||||
|
<el-submenu index="more" class="el-submenu__hide-arrow" v-if="moreRoutes.length > 0"> |
||||
|
<template slot="title">更多菜单</template> |
||||
|
<sidebar-item :key="route.path + index" v-for="(route, index) in moreRoutes" :item="route" :base-path="route.path" /> |
||||
|
</el-submenu> |
||||
|
</el-menu> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import SidebarItem from '../Sidebar/SidebarItem' |
||||
|
|
||||
|
export default { |
||||
|
components: { SidebarItem }, |
||||
|
data() { |
||||
|
return { |
||||
|
// 顶部栏初始数 |
||||
|
visibleNumber: 5 |
||||
|
} |
||||
|
}, |
||||
|
computed: { |
||||
|
theme() { |
||||
|
return this.$store.state.settings.theme |
||||
|
}, |
||||
|
topMenus() { |
||||
|
return this.$store.state.permission.sidebarRouters.filter((f) => !f.hidden).slice(0, this.visibleNumber) |
||||
|
}, |
||||
|
moreRoutes() { |
||||
|
const sidebarRouters = this.$store.state.permission.sidebarRouters; |
||||
|
return sidebarRouters.filter((f) => !f.hidden).slice(this.visibleNumber, sidebarRouters.length - this.visibleNumber) |
||||
|
}, |
||||
|
// 默认激活的菜单 |
||||
|
activeMenu() { |
||||
|
const { meta, path } = this.$route |
||||
|
if (meta.activeMenu) { |
||||
|
return meta.activeMenu |
||||
|
} |
||||
|
return path |
||||
|
}, |
||||
|
}, |
||||
|
beforeMount() { |
||||
|
window.addEventListener('resize', this.setVisibleNumber) |
||||
|
}, |
||||
|
beforeDestroy() { |
||||
|
window.removeEventListener('resize', this.setVisibleNumber) |
||||
|
}, |
||||
|
mounted() { |
||||
|
this.setVisibleNumber() |
||||
|
}, |
||||
|
methods: { |
||||
|
// 根据宽度计算设置显示栏数 |
||||
|
setVisibleNumber() { |
||||
|
const width = document.body.getBoundingClientRect().width / 3 |
||||
|
this.visibleNumber = parseInt(width / 85) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style lang="scss"> |
||||
|
.topbar-menu.el-menu--horizontal > .el-menu-item { |
||||
|
float: left; |
||||
|
height: 50px !important; |
||||
|
line-height: 50px !important; |
||||
|
color: #303133 !important; |
||||
|
padding: 0 5px !important; |
||||
|
margin: 0 10px !important; |
||||
|
} |
||||
|
|
||||
|
.el-menu-item.is-active .svg-icon + span, .el-submenu.is-active .svg-icon + span{ |
||||
|
color: v-bind(theme); |
||||
|
} |
||||
|
|
||||
|
.el-menu--horizontal .el-menu .el-menu-item, .el-menu--horizontal .el-menu .el-submenu__title { |
||||
|
color: #303133 !important; |
||||
|
} |
||||
|
|
||||
|
/* submenu item */ |
||||
|
.topbar-menu.el-menu--horizontal > .el-submenu .el-submenu__title { |
||||
|
float: left; |
||||
|
height: 50px !important; |
||||
|
line-height: 50px !important; |
||||
|
color: #303133 !important; |
||||
|
padding: 0 5px !important; |
||||
|
margin: 0 10px !important; |
||||
|
} |
||||
|
|
||||
|
/* 图标右间距 */ |
||||
|
.topbar-menu .svg-icon { |
||||
|
margin-right: 4px; |
||||
|
} |
||||
|
|
||||
|
/* topbar more arrow */ |
||||
|
.topbar-menu .el-submenu .el-submenu__icon-arrow { |
||||
|
position: static; |
||||
|
vertical-align: middle; |
||||
|
margin-left: 8px; |
||||
|
margin-top: 0px; |
||||
|
} |
||||
|
|
||||
|
/* menu__title el-menu-item */ |
||||
|
.topbar-menu.el-menu--horizontal .el-submenu__title, .topbar-menu.el-menu--horizontal .el-menu-item { |
||||
|
height: 55px; |
||||
|
padding: 0 15px; |
||||
|
} |
||||
|
</style> |
||||
Loading…
Reference in new issue