el-menu结合vue-router生成左侧导航栏,并设置选中状态以及hidden隐藏

1、vue-router:index.js

import Vue from 'vue'
import VueRouter from 'vue-router'

Vue.use(VueRouter)

import Layout from '@/layout'


export const routes = [{
        path: '/',
        component: Layout,
        hidden: true,
        redirect: "/swiperInfo",
        name: 'Layout'
    },
    {
        path: '/login',
        component: () =>
            import ('@/views/login/login'),
        hidden: true,
        name: 'login'
    },
    {
        path: '/index',
        component: Layout,
        redirect: "/swiperInfo",
        meta: {
            name: "轮播图管理",
            icon: "el-icon-menu"
        },
        children: [{
                path: '/swiperInfo',
                component: () =>
                    import ('@/views/swiper/index'),
                // hidden: true,
                name: '轮播图信息',
                meta: {
                    name: "轮播图信息",
                    icon: "el-icon-menu",

                }
            },
            {
                path: '/addSwiper',
                component: () =>
                    import ('@/views/swiper/add-swiper'),
                name: '添加轮播图',
                // hidden: true,
                meta: {
                    name: "添加轮播图",
                    icon: "el-icon-menu",
                }
            },
            {
                path: '/updateSwiper/:id',
                component: () =>
                    import ('@/views/swiper/update-swiper'),
                name: '修改轮播图',
                hidden: true,
                meta: {
                    name: "轮播图信息",
                    icon: "el-icon-menu",
                }
            }
        ]
    },
    {
        path: '/user',
        component: Layout,
        redirect: "/userInfo",
        meta: {
            name: "个人信息管理",
            icon: "el-icon-menu"
        },
        children: [{
            path: '/userInfo',
            component: () =>
                import ('@/views/user/index'),
            // hidden: true,
            name: '用户信息',
            meta: {
                name: "用户信息",
                icon: "el-icon-menu",

            }
        }]
    }
]

const router = new VueRouter({
    mode: 'history',
    base: process.env.BASE_URL,
    routes
})

export default router

2、SilderBar.vue

<template>
  <div id="SilderBar">
    <el-container>
      <el-aside :width="isCollapse ? '64px' : '240px'">
        <el-menu
          :default-active="$route.meta.name"
          class="el-menu-vertical-demo"
          background-color="#545c64"
          text-color="#fff"
          align="left"
          active-text-color="#ffd04b"
          :unique-opened="true"
          :collapse="isCollapse"
          :collapse-transition="false"
        >
          <div v-for="(item, index) in getRouter" :key="index">
            <div v-if="item.children.length == 1">
              <el-menu-item :index="item.children[0].meta.name" @click="$router.push(item.children[0].path)">
                <i :class="item.children[0].meta.icon"></i>
                <span slot="title" v-text="item.children[0].meta.name"></span>
              </el-menu-item>
            </div>
            <div v-else>
              <el-submenu :index="item.meta.name">
                <template slot="title">
                  <i :class="item.meta.icon"></i>
                  <span
                    slot="title"
                    v-text="item.meta.name"
                    :style="{ display: isCollapse ? 'none' : '' }"
                  ></span>
                </template>
                <el-menu-item-group
                  v-for="(item1, index1) in item.children"
                  :key="index1"
                  align="center"
                >
                  <el-menu-item :index="item1.meta.name" @click="$router.push(item1.path)">
                    <i :class="item1.meta.icon"></i>
                    <span slot="title" v-text="item1.meta.name"></span>
                  </el-menu-item>
                </el-menu-item-group>
              </el-submenu>
            </div>
          </div>
        </el-menu>
      </el-aside>
      <el-main>
        <el-breadcrumb separator-class="el-icon-arrow-right">
          <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
          <el-breadcrumb-item
            v-for="(item, index) in levelList"
            :key="index"
            :to="{ path: item.path }"
            >{{ item.meta.name }}</el-breadcrumb-item
          >
        </el-breadcrumb>
        <router-view style="margin-top: 10px" />
      </el-main>
    </el-container>
  </div>
</template>

<script>
import { routes } from "@/router";
import store from "@/store";
export default {
  data() {
    return {
      projectRoutes: routes,
      isCollapse: false,
      levelList: [],
    };
  },
  methods: {},
  computed: {
    // 获取vue-router 并且去除hidden
    getRouter() {
      let data = [];
      this.projectRoutes.forEach((item) => {
        if ("hidden" in item) {
        } else {
          data.push(item);
        }
      });
      for (let i = 0; i < data.length; i++) {
        for (let j = 0; j < data[i].children.length; j++) {
          if ("hidden" in data[i].children[j]) {
            data[i].children.splice(j, 1);
            j -= 1;
          }
        }
      }
      return data;
    },
    // 监听store数据
    handelCollapse() {
      return store.getters.isCollapse;
    },
    getroute() {
      this.levelList = this.$route.matched;
      return this.$route.matched;
    },
  },
  watch: {
    handelCollapse(val) {
      this.isCollapse = val;
    },
    getroute(val) {
      this.levelList = val;
    },
  },
  mounted() {
    this.isCollapse = store.getters.isCollapse;
  },
};
</script>

<style lang="scss">
#SilderBar {
  .el-menu {
    border-right: solid 0px #e6e6e6 !important;
  }
  .el-breadcrumb__item {
    font-size: 14px !important;
    &:last-child {
      line-height: 15px;
    }
  }
  .el-aside {
    height: calc(100vh - 76px) !important;
    background-color: rgb(84, 92, 100);
  }
}
</style>
<style lang="scss" scoped>
#SilderBar {
  height: calc(100vh - 76px);
  border-top: 1px solid #ccc;
}
</style>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值