vue+elementUI使用递归实现左侧导航栏

2020-06-14  本文已影响0人  Poppy11

一、首先自己写一个JSON文件,这个JSON文件就是我们需要的分类的列表。例如:

const menuList = [
  {
    title : '用户管理',
    key : '/user',
    icon : 'el-icon-user-solid',
  },
  {
    title : '商品',
    key : '/products',
    icon : 'el-icon-s-goods',
    children : [
      {
        title : '品类管理',
        key : '/category',
        icon : 'bars',
      },
      {
        title : '商品管理',
        key : '/product',
        icon : 'tool',
      }
    ]
  },
  {
    title : '用户管理',
    key : '/userss',
    icon : 'user',
  },
  {
    title : '角色管理',
    key : '/role',
    icon : 'safety'
  },
  {
    title : '图形图表',
    key : '/charts',
    icon : 'area-chart',
    children: [
      {
        title : '柱线图',
        key : '/charts/bar',
        icon : 'bar-chart'
      },
      {
        title : '折线图',
        key : '/charts/line',
        icon : 'line-chart'
      },
      {
        title : '饼图',
        key : '/charts/pie',
        icon : 'pie-chart'
      },
    ]
  },
]

export default menuList

二、首先在home组件使用element布局模板,然后引入我们刚才定义的json文件,并且定义给data中的leftMenus,然后创建一个自定义组件home-left,将我们的leftMenus传给home-left这个子组件

这里要注意:default-active,这个属性意思是哪一个菜单处于高亮状态,在这里我们可以根据路由来匹配,如果不这样做,当我们在已经选择界面刷新的时候,那么已经选择的菜单则不会处于高亮状态

    <el-container>
      <el-aside>
        <el-menu
          router
          :default-active="$route.path"
          class="el-menu-vertical-demo"
          background-color="#545c64"
          text-color="#fff"
          active-text-color="#ffd04b">
          <home-left :navMenus="leftMenus"/>
        </el-menu>
      </el-aside>
      <el-container>
        <el-main>
          <router-view/>
        </el-main>

<script>
import menuList from '../../util/menuConfig'
export default {
    components: {HomeLeft},
    data() {
      return {
        leftMenus: menuList,
      }
    }
}
</script>

三、在子组件中我们需要使用props来接受传递过来的数据,并且在template中把遍历的children值再传递给自己这个组件,递归调用自己组件。这里的:index是唯一标志,:route是路由路径

<template>
  <div class="navMenu">
    <label v-for="navMenu in navMenus">
      <!--只有一级菜单-->
      <el-menu-item v-if="!navMenu.children"
                    :index="navMenu.key"
                    :route="navMenu.key"
      >
        <!--图标-->
        <i :class="navMenu.icon"></i>
        <!--标题-->
        <span slot="title">{{navMenu.title}}</span>
      </el-menu-item>
      <!--有多级菜单-->
      <el-submenu v-if="navMenu.children"
                  :key="navMenu.key"
                  :index="navMenu.key"
      >
        <template slot="title">
          <i :class="navMenu.icon"></i>
          <span> {{navMenu.title}}</span>
        </template>
        <!--递归组件,把遍历的值传回子组件,完成递归调用-->
        <nav-menu :navMenus="navMenu.children"></nav-menu>
      </el-submenu>
    </label>

  </div>
</template>

<script>
  export default {
    name: 'NavMenu', //使用递归组件必须要有
    props: ['navMenus'], // 传入子组件的数据
    data() {
      return {}
    },
    methods: {
      handleSelect(key,keyPath){
        console.log('1212')
        console.log(key,keyPath)
      }
    }
  }
</script>

<style scoped>

</style>

上一篇下一篇

猜你喜欢

热点阅读