详解 Vue3 动态路由 - 侧边栏菜单🍈

1,410 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第15天,点击查看活动详情

动态路由 - 侧边栏菜单🍈

引言

通过之前一段时间 ExpressMysql 的学习

这里尝试来搭建一个 后台系统 来巩固下学习的技术。

侧边栏菜单

在上一节,我们分析了一下,做一个 动态路由 所需要的条件。以及 简单的 静态路由

现在进行 侧边栏菜单动态 生成。

这需要我们的 菜单管理 所配置的 菜单,来进行处理

处理数据结构

分析一下我们所要的数据结构,其实和静态路由类似,但是少了一个 components

而且只是展示 菜单 类, 不需要展示 按钮

数据结构的示例如下

/**
 * 示例
 */
const demo = {
  path: '/',
  name: 'Layout',
  meta: {
    title: '首页', // 菜单名
    icon: 'icon-banbenqiehuan', // 菜单的icon
    alone: false, // 是否是单页
    hidden: false // 是否隐藏
  },
  children: []
}
  • 首先我们需要调取我们 菜单管理 中的所有 菜单,是一个列表

    • 接口的话,之前的文章已经写过了,这里就不粘贴了,直接撸干货。
  • 第二 就是 循环遍历我们的 菜单列表,来构造出我们所需的结构形式

  • 第三 由于不确定传来的 url 地址的格式

    • 所以我们必须将 url 地址,转成我们的 path 统一起来。
  • 接下来就是将得到的 菜单结构 通过 Pinia 保存起来

  • 最后在 侧边栏菜单 位置处 调用即可。

import { getMenusAll } from '@/api'

getMenusAll({})
  .then((res: any) => {
    const routeList = getTree(res.menus)
  })
  .catch((err) => {
    console.log('err', err)
  })
  
  
const getTree = (list, pid = 0, pidPath = '') => {
  return list
    .filter((item) => item.pid === pid)
    .map((item) => {
      const url = item.url.startsWith('/') ? item.url : '/' + item.url
      const pidRouterPath = pid === 0 ? url : pidPath + url
      return {
        path: pidRouterPath,
        name: pidRouterPath?.slice(1),
        pidRouterPath,
        meta: {
          title: item.name, // 菜单名
          icon: item.icon, // 菜单的icon
          hidden: item.type === 2 ? true : false, // 是否隐藏
          isDynamic: true // 是动态路由
        },
        children: item.type === 1 ? [] : getTree(list, item.id, pidRouterPath)
      }
    })
}

由于 侧边栏菜单 我们之前写好了,不需要动。所以只需要将数据保存起来

SetMenus(menus) {
  this.menus = menus
},

最终我们的侧边栏菜单就搞定了,附一个效果图

image.png

总结

通过 Express-Mysql-Vue3-TS-Pinia 做出一个 后台系统 项目

这里我们 将 侧边栏菜单 处理完毕