vuex管理侧边栏收缩

效果图:

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()

}

}

猜你喜欢

转载自blog.csdn.net/xfy991127/article/details/134476934