先看效果,整体界面结构如下
点击左侧菜单栏,右侧切换显示不同页面内容。
1 路由配置
路由配置如下:
const routes = [
{
path: "",
component: () => import("@/layout/baseView.vue"),
redirect: "/index",
children: [
{
path: "/index",
name: "首页",
icon: "SwitchButton",
hidden: false,
component: () => import("@/page/dashboard/dashboard.vue"),
},
{
path: "/content",
name: "内容",
icon: "Discount",
hidden: false,
component: () => import("@/layout/rightView.vue"),
children: [
{
path: "manage-comment",
icon: "MessageBox",
name: "管理评论",
hidden: false,
component: () => import("@/page/content/manageComment.vue"),
},
{
path: "manage-image",
icon: "Odometer",
name: "管理图片",
hidden: false,
component: () => import("@/page/content/manageImage.vue"),
},
],
},
{
path: "/user",
icon: "UserFilled",
name: "用户",
hidden: false,
component: () => import("@/layout/rightView.vue"),
children: [
{
path: "list",
icon: "User",
name: "用户列表",
hidden: false,
component: () => import("@/page/user/list.vue"),
},
{
path: "reset-pwd",
icon: "Unlock",
name: "重置密码",
hidden: false,
component: () => import("@/page/user/resetPwd.vue"),
},
// ....
],
},
{
path: "/operation",
icon: "Operation",
name: "运维",
hidden: false,
component: () => import("@/layout/rightView.vue"),
children: [
{
path: "mange-category",
icon: "Edit",
hidden: false,
name: "管理分类",
component: () => import("@/page/operation/manageCategory.vue"),
},
{
path: "mange-carousel",
icon: "Crop",
name: "管理轮播图",
hidden: false,
component: () => import("@/page/operation/manageCarousel.vue"),
},
],
},
],
},
{
path: "/login",
hidden: true,
component: () => import("@/page/login/login.vue"),
},
];
说明:
@/layout/baseView.vue
是整体页面结构
@/layout/rightView.vue
是公共页面用于显示数据内容。
@/page/login/login.vue
是登陆页面
2 页面结构
右侧数据内容视图是动态的,其它整个页面结构是固定的,因此提取baseView.vue
作为页面基本结构。
登录界面是另一个页面整体,因此login.vue
和基本结构页面baseView.vue
都在App.vue
页面中通过路由进行切换,因此App.vue
中添加router-view
进行动态路由渲染。
<template>
<div id="app">
<router-view></router-view>
</div>
</template>
左侧菜单导航,菜单是根据路由进行动态渲染的,所以将路由生成菜单抽取为独立组组件leftMenuBar.vue
。在mounted()
中获取路由配置
export default {
data() {
return {
menuList: [],
};
},
mounted() {
let routes = router.options.routes;
this.menuList = routes[0].children;
console.log(this.menuList);
},
};
在右侧数据视图页面rightView.vue
添加router-view
标签
<template>
<div class="right-view">
<div class="header"></div>
<div class="content">
<router-view></router-view>
</div>
</div>
</template>
3 结合Element-plus 生成菜单导航
遍历路由通过element-plus
的Menu组件
生成菜单导航,完整的代码如下:
<template>
<div>
<el-menu
default-active="0"
:unique-opened="true"
class="el-menu-vertical-demo"
>
<template v-for="(item, index) in menuList" :key="index">
<router-link :to="item.path" v-if="!item.children" :key="index">
<el-menu-item :index="index + ''">
<el-icon><component :is="item.icon"></component></el-icon>
<span>{{ item.name }}</span>
</el-menu-item>
</router-link>
<el-sub-menu :index="index + ''" v-else>
<template #title>
<el-icon><component :is="item.icon"></component></el-icon>
<span>{{ item.name }}</span>
</template>
<router-link
:to="item.path + '/' + sub.path"
v-for="(sub, subIndex) in item.children"
:key="subIndex"
>
<el-menu-item :index="index + '-' + subIndex">
<el-icon><component :is="sub.icon"></component></el-icon>
<span>{{ sub.name }}</span>
</el-menu-item>
</router-link>
</el-sub-menu>
</template>
</el-menu>
</div>
</template>
4 设置菜单图标
由于element-plus
使用svg
图标,复制的代码是<el-icon><Search /></el-icon>
这样的,因此在遍历路由时,就不能通过<i :calss = "xxxx"></i>
设置了,要通过<el-icon><component :is="xxxx"></component></el-icon>
来设置,:is
绑定的是icon
的名称
<el-icon><component :is="item.icon"></component></el-icon>