element-ui 左侧导航栏组件

element-ui 左侧导航栏的布局实现,效果如下图

涉及的组件:

  App.vue

  router.js

  layout.vue: nav.vue(左侧导航区域,内含循环小组件 asideBarItem.vue)、AppMain.vue (右侧主内容区域)

 项目结构如下:

  

1、App.vue,通过router路由来控制页面的渲染, 很简单,一个router-view

<template>
  <div id="app">
    <keep-alive> // 缓存组件,提高运行性能
      <router-view></router-view>
    </keep-alive>
  </div>
</template>

2、router.js  (重点),这里会引入layout作为模版组件, 以下举例组件可自行选择添加

import Vue from 'vue'
import Router from 'vue-router'
import Layout from '@/layout/layout.vue'
import AppMain from '@/layout/conponents/AppMain.vue'  // 右侧展示区域组件

Vue.use(Router)

export default new Router({
  base: process.env.BASE_URL,
  routes: [
    {
      path: '/',
      name: 'base',
      redirect: '/about',
      component: Layout,  // 主模版组件 
      meta: {  // 渲染右侧区域的面包屑标题
        title: '公共组件',
        levelList: []
      },
      children: [
        {
          path: '/about',
          name: 'baseAbout',
          component: () => import('./views/About.vue'),  // 懒加载组件,提高运行性能
          meta: {
            title: '关于我们',
            levelList: []
          }
        }
      ]
    },
    {
      path: '/user',
      name: 'User_Nav',
      component: Layout,
      meta: {
        title: '用户导航',
        levelList: []
      },
      children: [
        {
          path: '/user/info',
          name: 'userInfo',
          meta: {
            title: '用户信息',
            levelList: []
          },
          component: AppMain,  // 右侧区域模版组件
          children: [
            {
              path: '/user/info/userCenter',
              name: 'userCenter',
              meta: {
                title: '个人中心',
                levelList: []
              },
              component: AppMain,
              children: [
                {
                  path: '/user/info/userCenter/userLog',
                  name: 'orderList',
                  meta: {
                    title: '个人日志',
                    levelList: []
                  },
                  component: () => import('@/views/user.vue'),
                },
              ]
            },
            {
              path: '/user/info/order-list',
              name: 'orderList',
              meta: {
                title: '订单列表',
                levelList: []
              },
              component: () => import('@/views/orderList.vue')
            },
            {
              path: '/user/info/address-list',
              name: 'addressList',
              meta: {
                title: '地址列表',
                levelList: []
              },
              component: () => import('@/views/addressList.vue')
            }
          ]
        },
        {
          path: '/user/login',
          name: 'baseAboutLogin',
          meta: {
            title: '登陆组件',
            levelList: []
          },
          component: () => import('./views/login.vue')
        }
      ]
    }
  ]
})

3、layerout 文件夹

  3-1、 主文件 layout.vue

<template>
  <div class="app-contain">
       <!-- 左导航 -->
    <el-container class="index-container">
      <el-aside class="layout-contant">
        <Nav></Nav>
      </el-aside>
      
      <!-- 面包屑 简化学习,暂时屏蔽 -->
      <!-- <el-main>
        <el-breadcrumb separator-class="el-icon-arrow-right">
          <el-breadcrumb-item v-for="item in levelList" :key="item.path">
            <a :href="item.path" v-if="item.parent">{{item.meta.title}}</a>
            <span v-else>{{item.meta.title}}</span>
          </el-breadcrumb-item>
        </el-breadcrumb> -->

        <!-- 右边显示区域 -->
       <App-main></App-main>
      </el-main>
    </el-container>
  </div>
</template>

  3-2、nav.vue, 里面引入了asideBarItem.vue组件

<template>
  <div class="nav-contain">
    <el-menu
      router
      :default-active="$route.path"
      class="el-menu-vertical-demo"
      background-color="#545c64"
      text-color="#fff"
      active-text-color="#ffd04b"
    >
      <AsideBarItem v-for="router in routers" 
        :key="router.path"
        :router="router"
      >
      </AsideBarItem>
    </el-menu>
  </div>
</template>

<script>
import AsideBarItem from './asideBarItem'
export default {
  name: 'mynav',
  components: {
    AsideBarItem
  }
}
</script>

<style lang="scss" scope>
.nav-contain{
  text-align: left;
}
</style>

  3-3、asideBarItem.vue 小循环组件

<template>
  <div class="asideBarItem-contant">
    <!-- 如果hasOwnProperty监测有children 就循环递归展示 -->
    <el-submenu 
    :index="router.path"
     v-if="router.children">
      <span slot="title">{{router.meta.title}}</span>

      <!-- 递归有子孙导航组件 -->
      <asideBarItem
      v-for="child in router.children" 
      :key="child.path" 
      :router="child" >
      </asideBarItem>
    </el-submenu>

    <!-- 无子孙导航 -->
    <el-menu-item
    :key="router.path"
    :index="router.path"
    v-else
    >
      {{router.meta.title}}
    </el-menu-item>
  </div>
</template>

  3-4、AppMain.vue 右侧主渲染区域的组件, 很简单,一个router-view

<template>
  <div class="appMain-container">
    <keep-alive>
      <router-view></router-view>
    </keep-alive>
  </div>
</template>
<script>
  export default {
    data () {
         return {
        }
     }
  }
</script>
<style lang="scss" scoped>
   
</style>

注意:自定义的每个组件,写上一些内容便于切换识别

猜你喜欢

转载自www.cnblogs.com/cp-cookie/p/13368001.html