效果图:
1、新建侧边栏管理状态文件夹
2、navCollapse里的index.js
export default{
namespaced:true,
state:{ //仓库
isCollapse:false, //控制左侧菜单栏收缩的变量
},
mutations:{ // 修改
chanIsCollapse(state){
state.isCollapse = !state.isCollapse
}
}
}
3、store大文件夹的index.js引入
import Vue from 'vue'
import Vuex from 'vuex'
import navCollapse from "./navCollapse" //引入管理收缩的文件
Vue.use(Vuex)
export default new Vuex.Store({
modules: {
navCollapse
}
})
4、界面的布局、头部、侧边菜单栏、右边内容,新建下面几个文件
5、header文件
<template>
<div class="layout">
<NavBarView></NavBarView>
<div class="layout-right">
<HeaderView></HeaderView>
<ContentView></ContentView>
</div>
</div>
</template>
<script>
import NavBarView from './Navbar';
import HeaderView from './Header.vue'
import ContentView from './Content.vue'
export default {
data(){
return {
}
},
components:{
NavBarView,
HeaderView,
ContentView
}
}
</script>
<style lang="less" scoped>
.layout{
display: flex;
width: 100%;
height: 100%;
.layout-right{
flex:1;
/*padding-left: 220px;*/
}
}
</style>
6、content文件
<template>
<div class="layout-content">
<transition name="fade-transform" mode="out-in">
<router-view></router-view>
</transition>
</div>
</template>
<script>
export default {
data() {
return {
}
}
}
</script>
<style lang="less" scoped>
.layout-content {
padding: 20px;
height: calc(100% - 124px);
/*
background: url("@/assets/images/bg.jpg") center top no-repeat;
*/
background-size: 100% 100%;
}
.fade-transform-enter,.fade-transform-leave-to{
opacity: 0;
}
.fade-transform-enter-active,.fade-transform-leave-active{
transition: all .3s;
}
.fade-transform-enter-to.fade-transform-leave{
opacity: 1;
}
</style>
7、navbar文件
<template>
<div class="navBar" :class="{isColl:isCollapse}">
<el-menu
default-active="2"
class="el-menu-vertical-demo"
@open="handleOpen"
@close="handleClose"
background-color="#304156"
text-color="#fff"
active-text-color="#ffd04b"
:unique-opened="true"
:collapse="isCollapse"
:collapse-transition="false"
>
<el-submenu index="1">
<template slot="title">
<i class="el-icon-location"></i>
<span>导航一</span>
</template>
<el-menu-item index="1-1">选项1</el-menu-item>
<el-menu-item index="1-2">选项2</el-menu-item>
</el-submenu>
<el-menu-item index="2">
<i class="el-icon-menu"></i>
<span slot="title">导航二</span>
</el-menu-item>
<el-submenu index="2">
<template slot="title">
<i class="el-icon-location"></i>
<span>导航三</span>
</template>
<el-menu-item index="1-1">选项3</el-menu-item>
<el-menu-item index="1-2">选项4</el-menu-item>
</el-submenu>
</el-menu>
</div>
</template>
<script>
import { mapState } from 'vuex';
export default {
data() {
return {
// isCollapse:false
};
},
computed:{
...mapState({
isCollapse:state=>state.navCollapse.isCollapse
})
},
methods:{
handleOpen(){},
handleClose(){}
}
};
</script>
<style lang="less" scoped>
.navBar {
position: relative;
width: 220px;
height: 100%;
background-color: #304156;
box-shadow: 6px 0 5px #ccc;
transition: all 0.3s;
.el-menu {
border: none;
}
&.isColl {
width: 64px;
}
.main-login {
position: relative;
img {
width: 32px;
height: 32px;
padding: 10px 16px;
}
span {
color: #fff;
font-weight: bold;
min-width: 130px;
display: inline-block;
position: absolute;
top: 16px;
left: 62px;
}
}
}
.isColl .el-submenu__title span,
::v-deep.el-menu--collapse .el-submenu__title .el-submenu__icon-arrow {
display: none;
}
.el-submenu .el-menu-item {
background-color: rgb(38, 52, 69) !important;
}
.el-menu .el-menu-item:hover {
background-color: #444 !important;
}
/deep/.el-submenu__title:hover {
background-color: #444 !important;
}
/deep/.el-menu-item-group__title {
background-color: rgb(38, 52, 69) !important;
}
</style>
注意点:
1:解决collapse 滑动卡顿,如图文字一卡一卡的
解决:看elementUI 加 :collapse-transition="false"
2:写mapState是在computed
computed:{
...mapState({
isCollapse:state=>state.navCollapse.isCollapse
})
},
3:写修改状态在methods里的
methods:{
...mapMutations({
chanIsCollapse:"navCollapse/chanIsCollapse"
}),
changeShow(){
this.isShow = !this.isShow
this.chanIsCollapse()
}
}