当前位置:   article > 正文

vue + element-ui制作折叠式菜单_vue+elementui菜单折叠

vue+elementui菜单折叠

 

近期打算做一个进销存系统,因为好久没做前端了,花了一天的时间复习了下vue,用element-ui做了个折叠式菜单。其中复习到的知识点有

transition动画,vuex状态管理,vue-route路由。

1.设置路由

  1. import Vue from 'vue'
  2. import VueRouter from 'vue-router'
  3. import Home from '../pages/Home'
  4. import Sale from '../pages/sale/index'
  5. import Stock from '../pages/stock/index'
  6. Vue.use(VueRouter)
  7. //将路由配置在数组对象中
  8. export const mapMenu = [
  9. {
  10. path: '/',
  11. name: 'home',
  12. component: Home,
  13. noMenu: true
  14. },
  15. {
  16. path: '/lock',
  17. name: '锁屏页',
  18. component: Sale,
  19. noMenu: true
  20. },
  21. {
  22. path: '/dashboard',
  23. name: '首页',
  24. meta: { title: '首页', icon: '' },
  25. component: null
  26. },
  27. {
  28. path: '/sale',
  29. name: 'sale',
  30. component: Home, //设置字组件的父组件
  31. meta: { title: '销售管理', icon: '' },
  32. children: [
  33. {
  34. path: '/sale/offer',
  35. name: 'offer',
  36. component: Sale,
  37. meta: { title: '销售报价单', icon: '' }
  38. },
  39. {
  40. path: '/sale/indent',
  41. name: 'indent',
  42. component: Stock,
  43. meta: { title: '销售订货单', icon: '' }
  44. }
  45. ]
  46. },
  47. {
  48. path: '/stock',
  49. name: '库存管理',
  50. component: Home,
  51. meta: { title: '库存管理', icon: '' },
  52. children: [{
  53. path: '/stock/outStock',
  54. name: '出库管理',
  55. meta: { title: '出库管理', icon: '' },
  56. component: null
  57. },
  58. {
  59. path: '/stock/putStock',
  60. name: '入库管理',
  61. meta: { title: '入库管理', icon: '' },
  62. component: null
  63. },
  64. {
  65. path: '/stock/endMonthHandle',
  66. name: '月末处理',
  67. meta: { title: '月末处理', icon: '' },
  68. component: null
  69. }
  70. ]
  71. }
  72. ]
  73. //实例化路由
  74. const router = new VueRouter({
  75. routes: mapMenu
  76. })
  77. export default router

 新手在使用嵌套路由时,容易弄混子路由和父路由之间的建立关系。子路由的组件必须包含在父路由中,父组件下的router-view才能接受到信息,进行跳转。反之不会发生跳转。

2.vuex状态管理

因为后期需要进行前后端交互,涉及到用户的权限问题,所以把路由信息放进vuex状态管理中。这里我新建一个user.js,主要用来管理用户信息(以后的文章中会讲解)

  1. import { mapMenu } from '../../router'
  2. const user = {
  3. state: {
  4. menus: mapMenu
  5. }
  6. }
  7. export default user

 通过getters来获取用户信息。

  1. const getters = {
  2. menus: state => state.user.menus,
  3. barEffect: state => state.app.barEffect
  4. }
  5. export default getters

现在为大家讲解一下vuex的几个知识点。

state:定义状态存储的对象和对象初始化,state确认之后,程序运行时便不可动态添加对象。
mutations:对state的对象进行操作,切记,该操作为同步

actions:同样是对state的对象进行操作,那有了mutations,为什么还要用actions呢?mutations是只支持同步,而actions能通过异步来触发mutations里的操作。

  1. const app = {
  2. state: {
  3. barEffect: {
  4. open: true
  5. }
  6. },
  7. mutations: {
  8. TOGGLE_BAREFFECT: state => { //建议用大写加下划线定义mutations的方法
  9. state.barEffect.open = !state.barEffect.open
  10. }
  11. },
  12. actions: {
  13. ToggleBarEffect: ({ commit }) => {
  14. commit('TOGGLE_BAREFFECT') //触发mutations中的TOGGLE_BAREFFECT
  15. }
  16. }
  17. }

以上定义了一个barEffect对象,用来存储菜单栏是否折叠的状态

 

3.菜单栏

首先我们需要编写一个LeftMenu组件

  1. <template>
  2. <el-scrollbar wrapClass="scrollbar-wrapper">
  3. <el-menu mode="vertical"
  4. background-color="#545c64"
  5. text-color="#fff"
  6. active-text-color="#ffd04b"
  7. :collapse="isCollapse"
  8. :default-active="$route.path">
  9. <menu-item :menus="menus"></menu-item> //传递的是user中的menus
  10. </el-menu>
  11. </el-scrollbar>
  12. </template>
  13. import { mapGetters } from 'vuex'
  14. import MenuItem from './modules/MenuItem'
  15. export default {
  16. name: 'left-menus',
  17. components: { MenuItem },
  18. computed: {
  19. ...mapGetters([
  20. 'menus',
  21. 'barEffect'
  22. ]),
  23. isCollapse() {
  24. return !this.barEffect.open
  25. }
  26. }
  27. }

el-scrollbar是element默认的滚动条,可通过wrapClass和viewClass设置外部样式和内部样式。

el-menu中的属性自己去element-ui中查看。

接下来我们在定义menu-item菜单项

  1. <template>
  2. <div class="menu-item-wrapper">
  3. <template v-for="item in menus" v-if="!item.noMenu"> //遍历路由信息,排除非菜单路由
  4. <el-submenu v-if="item.children" :index="item.name" :key="item.name"> //判断是否有子路由,有的话需要遍历子路由
  5. <template slot="title">
  6. <i class="fa fa-bath" aria-hidden="true"></i>
  7. <span v-if="item.meta&&item.meta.title">{{item.meta.title}}</span>
  8. </template>
  9. <template v-for="child in item.children">
  10. <router-link :to="child.path" :key="child.name">
  11. <el-menu-item :index="item.path + child.path" >
  12. <i class="fa fa-bath" aria-hidden="true"></i>
  13. <span v-if="child.meta&&child.meta.title" slot="title">{{child.meta.title}}</span>
  14. </el-menu-item>
  15. </router-link>
  16. </template>
  17. </el-submenu>
  18. <router-link v-else :to="item.path" :key="item.name"> //没有子路由则直接进入这一步
  19. <el-menu-item :index="item.path" class="submenu-title-noDropdown">
  20. <i class="fa fa-bath" aria-hidden="true"></i>
  21. <span v-if="item.meta&&item.meta.title" slot="title">{{item.meta.title}}</span>
  22. </el-menu-item>
  23. </router-link>
  24. </template>
  25. </div>
  26. </template>

到了这一步我们的折叠菜单基本就完成了,实现的效果如下

 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号