前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >《vue3+ts+element-plus 后台管理系统系列三》之路由侧边栏

《vue3+ts+element-plus 后台管理系统系列三》之路由侧边栏

作者头像
星宇大前端
发布2021-02-22 14:51:28
3.9K0
发布2021-02-22 14:51:28
举报
文章被收录于专栏:大宇笔记大宇笔记

vue3-composition-admin 是一个管理端模板解决方案,它是基于vue3,ts和element-plus,项目都是以composition api风格编写。

路由和侧边栏

路由和侧边栏是组织起一个后台应用的关键骨架。

本项目侧边栏和路由是绑定在一起的,所以你只有在 @/router/index.js 下面配置对应的路由,侧边栏就能动态的生成了。大大减轻了手动重复编辑侧边栏的工作量。当然这样就需要在配置路由的时候遵循一些约定的规则。

配置项


首先我们了解一下本项目配置路由时提供了哪些配置项。

代码语言:javascript
复制
// 当设置 true 的时候该路由不会在侧边栏出现 如401,login等页面,或者如一些编辑页面/edit/1
hidden: true // (默认 false)

//当设置 noRedirect 的时候该路由在面包屑导航中不可被点击
redirect: 'noRedirect'

name: 'router-name' // 设定路由的名字,一定要填写不然使用<keep-alive>时会出现各种问题
meta: {
// 当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式--如组件页面
// 只有一个时,会将那个子路由当做根路由显示在侧边栏--如引导页面
// 若你想不管路由下面的 children 声明的个数都显示你的根路由
// 你可以设置 alwaysShow: true,这样它就会忽略之前定义的规则,一直显示根路由
  alwaysShow: true
  roles: ['admin', 'editor'] // 设置该路由进入的权限,支持多个权限叠加
  title: 'title' // 设置该路由在侧边栏和面包屑中展示的名字
  icon: 'iconfont name' // iconfont symbol名称
  noCache: true // 如果设置为true,则不会被 <keep-alive> 缓存(默认 false)
  breadcrumb: false //  如果设置为false,则不会在breadcrumb面包屑中显示(默认 true)
  affix: true // 如果设置为true,它则会固定在tags-view中(默认 false)

  // 当路由设置了该属性,则会高亮相对应的侧边栏。
  // 这在某些场景非常有用,比如:一个文章的列表页路由为:/article/list
  // 点击文章进入文章详情页,这时候路由为/article/1,但你想在侧边栏高亮文章列表的路由,就可以进行如下设置
  activeMenu: '/article/list'
}

示例:

代码语言:javascript
复制
{
  path: '/permission',
  component: Layout,
  redirect: '/permission/index', //重定向地址,在面包屑中点击会重定向去的地址
  hidden: true, // 不在侧边栏显示
  alwaysShow: true, //一直显示根路由
  meta: { roles: ['admin','editor'] }, //你可以在根路由设置权限,这样它下面所有的子路由都继承了这个权限
  children: [{
    path: 'index',
    component: ()=>import('permission/index'),
    name: 'permission',
    meta: {
      title: 'permission',
      icon: '#iconquanxian', //图标,不要忘记#
      roles: ['admin','editor'], //或者你可以给每一个子路由设置自己的权限
      noCache: true // 不会被 <keep-alive> 缓存
    }
  }]
}

路由


这里的路由分为两种,constantRoutesasyncRoutes

constantRoutes: 代表那些不需要动态判断权限的路由,如登录页、404、等通用页面。

asyncRoutes: 代表那些需求动态判断权限并通过 addRoutes 动态添加的页面。

具体的会在 权限验证 页面介绍。

路由写在前端:

这里做了一个小处理,路由都写在 @/router/index.js不利于合作开发,容易冲突。 利用webpack 分别加载了 constantRoutesasyncRoutes。 只需要在文件夹内新建自己路由即可。

在这里插入图片描述
在这里插入图片描述

不明白的可以查看 require.context API

代码语言:javascript
复制
const asyncFiles = require.context('./permissionModules', true, /\.ts$/)
let permissionModules: Array<RouteRecordRaw> = []
asyncFiles.keys().forEach((key) => {
  if (key === './index.ts') return
  permissionModules = permissionModules.concat(asyncFiles(key).default)
})
代码语言:javascript
复制
export const asyncRoutes: Array<RouteRecordRaw> = [
  ...permissionModules
]

侧边栏


代码 @/layout/components/Sidebar

项目侧边栏主要基于 element-plusel-menu 改造。

主要是有下面几个文件组成:

在这里插入图片描述
在这里插入图片描述
  • Index.vue (主文件)
  • SidebarItem.vue (侧边栏item定制,需要单独抽出来,多级路由嵌套需要它来递归)
  • SidebarItemLink.vue (嵌套在SidebarItem 的上一层,区分外链和路由跳转)
  • SidebarLogo.vue (侧边栏最上部的logo,可以隐藏和显示)

Index.vue

通过vuex获取展示数据

代码语言:javascript
复制
 const routes = computed(() => {
      return store.state.permission.routes
 })

element-plus侧边栏风格配置

代码语言:javascript
复制
     <el-menu
        //是否展开
        :collapse="!isCollapse"
        //是否只保持一个子菜单的展开。
        :unique-opened="false"
        //默认选中
        :default-active="activeMenu"
        //背景颜色
        :background-color="variables.menuBg"
        //文字颜色
        :text-color="variables.menuText"
        //文字高亮颜色
        :active-text-color="menuActiveTextColor"
        mode="vertical"
      >
        //单独抽取,方便递归
        <SidebarItem
          v-for="route in routes"
          :key="route.path"
          :item="route"
          :base-path="route.path"
          :is-collapse="isCollapse"
        />
      </el-menu>

SidebarItem.vue

路由嵌套

代码语言:javascript
复制
<template>
  <div
    v-if="!item.meta || !item.meta.hidden"
    :class="[isCollapse ? 'simple-mode' : 'full-mode', {'first-level': isFirstLevel}]"
  >
     // alwaysShowRootMenu:alwaysShow === false
     // theOnlyOneChild 只有一个子路由
    <template v-if="!alwaysShowRootMenu && theOnlyOneChild && !theOnlyOneChild.children">
        <el-menu-item>
        </el-menu-item>
    </template>
    <el-submenu
      v-else
    >
      <template v-if="item.children">
        <sidebar-item
          v-for="child in item.children"
        />
      </template>
    </el-submenu>
  </div>
</template>

多级目录(嵌套路由)


如果你的路由是多级目录,如本项目 @/views/nested 那样, 有三级路由嵌套的情况下,不要忘记还要手动在二级目录的根文件下添加一个 <router-view>

代码语言:javascript
复制
 <!-- 父级路由组件  -->
<template>
  <div>
    <!-- xxx html 内容  -->
    <router-view />
  </div>
</template>

如:@/views/nested/menu1/index.vue,原则上有多少级路由嵌套就需要多少个<router-view>

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-02-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 路由和侧边栏
    • 配置项
      • 路由
        • 侧边栏
          • Index.vue
          • SidebarItem.vue
        • 多级目录(嵌套路由)
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档