云e办前端学习(三)菜单页面的动态路由导航

前言

本系列博客基于B站的云e办管理系统,前端和后端我都自己敲了一遍,这里做一个学习记录。云e办的原始视频链接如下:https://www.bilibili.com/video/BV1Ai4y1P7Tk?p=1


安装vuex

npm install vuex -S

新建文件

在这里插入图片描述

import Vue from 'vue'
import Vuex from 'vuex'
import {forEach} from "core-js/internals/array-iteration";

Vue.use(Vuex)

const store = new Vuex.Store({
  // 这里存放路由配置项
  state: {
    routes: []
  },
  //可以同步操作state数据
  mutations: {
    initRoutes(state,data) {
      state.routes = data;
    }
  },
  //可以用来异步操作
  actions: {
  }
})

export default store;

写一个处理菜单跳转的工具类

在这里插入图片描述

import { getRequest } from "./api";

export const initMenu = (router, store) => {
    if (store.state.routes.length > 0) {
        return;
    }
    getRequest("/system/cfg/menu").then(data => {
        if (data) {
            //  格式化Router
            let fmtRoutes = formatRoutes(data);
            // 添加到路由
            for (let x of fmtRoutes) {
                router.addRoute(x)
            }
            //将数据存入vuex
            store.commit('initRoutes', fmtRoutes);
            store.dispatch('connect');
        }
    })
}

//  routes是从后端接收过来的data数据
export const formatRoutes = (routes) => {
    let fmtRoutes = [];
    routes.forEach(item => {
        let {
            path,
            component,
            name,
            iconCls,
            children
        } = item;
        if (children && children instanceof Array) {
            // 递归
            children = formatRoutes(children);
        }
        let fmRouter = {
            path: path,
            name: name,
            iconCls: iconCls,
            children: children,
            component(resolve) {
                if (component.startsWith('Home')) {
                    require(['../views/' + component + '.vue'], resolve);
                } else if (component.startsWith('Emp')) {
                    require(['../views/emp/' + component + '.vue'], resolve);
                } else if (component.startsWith('Per')) {
                    require(['../views/per/' + component + '.vue'], resolve);
                } else if (component.startsWith('Sal')) {
                    require(['../views/sal/' + component + '.vue'], resolve);
                } else if (component.startsWith('Sta')) {
                    require(['../views/sta/' + component + '.vue'], resolve);
                } else if (component.startsWith('Sys')) {
                    require(['../views/sys/' + component + '.vue'], resolve);
                }
            }
        }
        fmtRoutes.push(fmRouter)
    });
    return fmtRoutes;
}

需要注意的是,这里格式化路由项,然后再添加到路由组件中,这种批量导入的方式已经不再适用,会报错或者提示使用router.addRoute的方式。

在这里插入图片描述

我这里遇到了另一个问题。我的第一层目录,也就是导航页面,要是不加入路径字段,浏览器控制台会报“没有定义路由路径”的错误。我在尝试了扫描第一层菜单项的children、以及筛选path不是“/”的路由项,均以失败告终。最后只好在这里加上path的字段。

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Vue 3前端项目中,实现动态路由导航菜单的思路是,在系统提供默认的路由后,登录后读取菜单/路由数据进行加载。可能会出现默认路由与动态路由有重叠的情况,解决方法是覆盖。菜单与路由数据可以合并为一个数据结构。 一般来说,前端项目中的路由需要动态注册。因为菜单可能在管理系统中维护,还需要与权限绑定。用户登录后,需要动态展示菜单菜单通常与路由相关联,因此,路由需要动态注册。 具体实现的步骤如下: 1. 创建一个名为setup.js的文件,用于组装路由和菜单。 2. 导入默认路由和统一命名的首页路由项。 3. 导入具体业务系统的路由。 4. 在导出的函数中,获取动态路由。可以从指定文件加载或从后端获取。 5. 对齐首页路由项,即使默认路由与业务路由的首页保持一致的命名。 6. 遍历动态路由项,并使用router.addRoute()方法添加动态路由。 下面是一个示例代码: ```javascript import fixItems from "./default"; // 默认路由 import { HomeName } from "./default"; // 统一命名首页路由项 import projectItems from "@/modules/router"; // 具体业务系统的路由 export default (router) => { // 获取动态路由 const dynaItems = getDynamicItems(); // 对齐首页路由项 adpatHome(HomeName, dynaItems); // 添加动态路由 dynaItems.forEach((value) => { router.addRoute(value); }); }; const getDynamicItems = () => { /* 获取动态路由,从指定文件加载或从后端获取 */ return projectItems; }; // 默认路由与业务路由对齐首页的路由信息 // 所谓对齐,就是大家的name保持一致,这样才能保证动态加入的路由项,覆盖掉前面的path和name相同的路由 const adpatHome = (HomeName, dynaItems) => { let home = dynaItems.filter((item) => { return item.path === "/"; }); if (home.length > 0 && home

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值