soul2.cn的vue项目
http://soul2.cn
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.
131 lines
3.0 KiB
131 lines
3.0 KiB
<template>
|
|
<div id="navbar">
|
|
<el-menu
|
|
:default-active="activeMenu"
|
|
:background-color="variables.menuBg"
|
|
:text-color="variables.menuText"
|
|
:active-text-color="variables.menuActiveText"
|
|
:unique-opened="false"
|
|
:collapse-transition="false"
|
|
mode="horizontal"
|
|
:router="true"
|
|
:style="menuStyle"
|
|
>
|
|
<el-col :xs="menuItemSize.xs" :sm="menuItemSize.sm" :md="menuItemSize.md" :lg="menuItemSize.lg"
|
|
:xl="menuItemSize.xl"
|
|
v-for="(route, i) in routes" :key="i">
|
|
<el-menu-item v-if="route.children.length === 1" :index="to(route.children[0])">
|
|
{{ title(route.children[0]) }}
|
|
</el-menu-item>
|
|
<el-submenu v-else-if="route.children.length > 1" :index="route.path">
|
|
<template slot="title">{{ route.meta.title || title(route.children[0]) }}</template>
|
|
<el-menu-item v-for="(child) in route.children" :key="child.path" :index="to(child)">
|
|
{{ child.meta.title }}
|
|
</el-menu-item>
|
|
</el-submenu>
|
|
</el-col>
|
|
</el-menu>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import variables from '@/style/layout/variables.scss'
|
|
import {mapGetters} from "vuex";
|
|
|
|
export default {
|
|
name: "Navbar",
|
|
components: {},
|
|
data() {
|
|
return {
|
|
screenWidth: document.body.clientWidth
|
|
}
|
|
},
|
|
computed: {
|
|
...mapGetters([
|
|
'routes'
|
|
]),
|
|
menuItemSize() {
|
|
return {
|
|
xs: 6,
|
|
sm: 5,
|
|
md: 4,
|
|
lg: 3,
|
|
xl: 2
|
|
}
|
|
},
|
|
menuStyle() {
|
|
if (this.screenWidth >= 600) {
|
|
return {
|
|
paddingLeft: '15%',
|
|
paddingRight: '15%'
|
|
}
|
|
} else {
|
|
return {}
|
|
}
|
|
},
|
|
activeMenu() {
|
|
const route = this.$route
|
|
const {meta, path} = route
|
|
// if set path, the sidebar will highlight the path you set
|
|
if (meta.activeMenu) {
|
|
return meta.activeMenu
|
|
}
|
|
return path
|
|
},
|
|
variables() {
|
|
return variables
|
|
},
|
|
},
|
|
mounted() {
|
|
window.onresize = () => {
|
|
this.screenWidth = document.body.clientWidth
|
|
}
|
|
// console.log('routes -> ', this.routes)
|
|
},
|
|
watch: {
|
|
screenWidth(newValue) {
|
|
// 为了避免频繁触发resize函数导致页面卡顿,使用定时器
|
|
if (!this.timer) {
|
|
// 一旦监听到的screenWidth值改变,就将其重新赋给data里的screenWidth
|
|
this.screenWidth = newValue;
|
|
this.timer = true;
|
|
setTimeout(() => {
|
|
//console.log(this.screenWidth);
|
|
this.timer = false;
|
|
}, 400);
|
|
}
|
|
}
|
|
},
|
|
methods: {
|
|
title(route) {
|
|
return route.meta.title
|
|
},
|
|
to(route) {
|
|
return route.path
|
|
}
|
|
},
|
|
}
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
@import "~@/style/layout/variables.scss";
|
|
|
|
#navbar {
|
|
position: fixed;
|
|
top: 0;
|
|
left: 0;
|
|
width: 100%;
|
|
z-index: 9;
|
|
}
|
|
|
|
.is-active {
|
|
border-bottom: #{$subMenuActiveText} 3px solid;
|
|
}
|
|
|
|
.el-menu-item {
|
|
-webkit-user-select: none;
|
|
-moz-user-select: none;
|
|
-ms-user-select: none;
|
|
user-select: none;
|
|
}
|
|
</style>
|
|
|