vue 基于elementUi根据路由表动态加载侧边栏导航

vue 基于elementUi根据路由表动态加载侧边栏导航

在学习element-admin后,发现动态路由很有意思,打算自己重现一下动态路由功能

路由router.js:在路由中可以添加hidden字段判断该路由是否显示

const routes = [
  {
    path: '/',
    redirect: '/container',
    hidden: true//控制该路由是否显示
  },

  {
    path: '/container',
    name: 'Container',
    component: () => import('@/layout/Container'),
    hidden: true,
    children: [
      {
        path: '/home',
        name: 'Home',
        component: () => import('@/views/home'),
        meta: {
          title: '首页'
          ,
          icon: 'el-icon-s-tools'
        }
      },
      {
        path: '/tree',
        name: 'Tree',
        component: () => import('@/views/Tree'),
        meta: {
          title: '树',
          icon: 'el-icon-user'
        }
      },
      // 多级嵌套路由尝试
      {
        path: '/menu1',
        name: 'Menu1',
        component: () => import('@/views/menu1'),
        meta: {
          title: 'Menu1'
          ,
          icon: 'el-icon-phone'
        },
        children: [
          {
            path: '/menu1-1',
            name: 'Menu1-1',
            component: () => import('@/views/menu1/menu1-1'),
            meta: {
              title: 'Menu1-1',
              icon: 'el-icon-goods'
            },
            children: [
              {
                path: '/menu1-1-1',
                name: 'Menu1-1-1',
                component: () => import('@/views/menu1/menu1-1/menu1-1-1'),
                meta: {
                  title: 'Menu1-1-1',
                  icon: 'el-icon-success'
                },
              }
            ]
          }
        ]
      }
    ]
  },

]

SideItem.vue组件递归

<template>
  <div>
    <div v-for="(item, index) in tree" :key="index">
      <!-- hidden=true且该路由又有子路由时 直接递归进入子路由 -->
      <div v-if="item.hidden && item.children">
        <SideItem :tree="item.children"></SideItem>
      </div>
      <div v-if="!item.hidden">
        <el-submenu :index="item.path" v-if="item.children">
          <template slot="title">
            <i :class="item.meta.icon || ''"></i>
            <span>{{ item.meta.title }}</span>
          </template>
          <SideItem :tree="item.children"></SideItem>
        </el-submenu>

        <el-menu-item :index="item.path" v-if="!item.children">
          <i :class="item.meta.icon || ''"></i>
          <span slot="title">
            {{ item.meta.title }}
          </span>
        </el-menu-item>
      </div>
    </div>
  </div>
</template>
<script>
export default {
  name: "SideItem",
  props: {
    tree: {
      type: Array,
    },
  },
  data() {
    return {};
  },
  mounted() {},
  methods: {},
};
</script>
<style lang="scss" scoped>
</style>

侧边栏SideBar.vue

<template>
  <div>
    <el-row class="tac">
      <el-col>
        <el-menu
          default-active="2"
          class="el-menu-vertical-demo"
          background-color="#545c64"
          text-color="#fff"
          active-text-color="#ffd04b"
          router
        >
          <SideItem :tree="routes"> </SideItem>
        </el-menu>
      </el-col>
    </el-row>
  </div>
</template>
<script>
import SideItem from "@/components/SideItem";

export default {
  components: {
    SideItem,
  },
  data() {
    return {
      routes: [], //路由表
    };
  },
  created() {
    this.getRoutes();
  },
  mounted() {},
  methods: {
    getRoutes() {
      // 获取所有路由表
      this.routes = this.$router.options.routes;
    },
  },
  computed: {},
};
</script>
<style lang="sass" scoped>
</style>
  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
你可以使用 Vue.js 和 Element UI 来动态加载侧边栏。下面是一个示例的代码: 首先,你需要在你的 Vue 组件中引入 Element UI 的侧边栏组件: ```javascript import { Menu, Submenu, MenuItem } from 'element-ui'; ``` 然后,在你的组件中定义一个侧边栏的数据源,可以是一个数组或者是从后端获取的数据: ```javascript data() { return { sidebarMenu: [ { title: '菜单1', icon: 'el-icon-location', children: [ { title: '子菜单1', path: '/sub-menu-1' }, { title: '子菜单2', path: '/sub-menu-2' } ] }, { title: '菜单2', icon: 'el-icon-menu', path: '/menu-2' }, // ... ] } } ``` 接着,在你的模板中使用 `el-menu` 和 `el-submenu` 组件来渲染侧边栏: ```html <el-menu> <template v-for="item in sidebarMenu"> <el-submenu v-if="item.children" :index="item.title"> <template slot="title"> <i :class="item.icon"></i> <span>{{ item.title }}</span> </template> <el-menu-item v-for="child in item.children" :key="child.path" :index="child.path"> {{ child.title }} </el-menu-item> </el-submenu> <el-menu-item v-else :key="item.path" :index="item.path"> <i :class="item.icon"></i> <span>{{ item.title }}</span> </el-menu-item> </template> </el-menu> ``` 最后,你可以根据需要在组件的生命周期钩子或者其他逻辑中动态修改 `sidebarMenu` 的值,从而实现动态加载侧边栏。 请注意,上述代码仅为示例,你可能需要根据你的具体需求进行调整。同时,确保你已经正确引入了 Element UI 组件和样式。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值