首页 > 其他分享 >若依菜单改造(三):根据不同项目,加载动态菜单

若依菜单改造(三):根据不同项目,加载动态菜单

时间:2023-05-30 16:37:31浏览次数:66  
标签:菜单 projectId 若依 state SIDEBAR sidebarRouters newRoutes 路由 加载

需求

切换项目,加载不同的菜单项。

效果:

image

思路

实现方式

加载的菜单项数据不同,那么要请求接口,根据返回数据渲染菜单。

因此,路由不能通过 菜单管理 方式添加,也不能在 router.js 中写死,只能用 router.addRoutes() 动态添加。

添加时机

全局监听项目id,切换项目时,触发 router.addRoutes()

触发方式:Vuex

路由池

要往侧边栏添加菜单项,即添加到 sidebarRouters 中。

代码

App.vue 全局监听 projectId

src/App.vue
import store from "./store";
  computed: {
    projectId() {
      return this.$route.query.projectId;
    },
  },
  watch: {
    // 全局监听项目id
    projectId: {
      handler(newVal, oldVal) {
        if (!newVal || newVal == oldVal) return;
        // 请求项目菜单路由
        store.dispatch("GeneProAppRoutes", newVal);
      },
      immediate: true,
    },
  },

Vuex 中:请求接口、生成路由

src/store/modules/permission.js
import { queryProApps } from "@/api/app_ele.js";

mutations: {
    // 在原侧边栏路由的基础上更新路由
    UPDATE_SIDEBAR_ROUTES: (state, [routes, insertIndex]) => {
      if (!insertIndex) {
        state.sidebarRouters = state.sidebarRouters.concat(routes);
      } else {
        let arr = [...state.sidebarRouters];
        arr.splice(insertIndex, 0, ...routes);
        state.sidebarRouters = arr;
      }
    },
    // 移除某个侧边栏路由
    REMOVE_SIDEBAR_ROUTES: (state, routePath) => {
      state.sidebarRouters = state.sidebarRouters.filter(
        (item) => item.path !== routePath
      );
    },
}

actions: {
    // 动态路由
    GeneProAppRoutes({ commit }, projectId) {
      return new Promise((resolve) => {
        // 根据项目id生成项目库应用路由列表
        queryProApps({ projectId }).then((res) => {
          let proAppRoutes = res.data.map((ele) => {
            let obj = {
              component: () =>
                import(
                  /* webpackChunkName: 'appEle' */ "@/views/data-manage/app-ele/index.vue"
                ),
              name: "AppEle",
              meta: {
                icon: "chart",
              },
            };
            obj.path = `appEle/${ele.applyId}`;
            obj.meta.title = ele.applyName;
            return obj;
          });

          let newRoutes = [
            {
              path: "/project/data",
              component: Layout,
              redirect: "noRedirect",
              meta: {
                menuTitle: `项目空间`,
                title: `数据管理`,
                icon: "documentation",
              },
              alwaysShow: true,
            },
          ];
          newRoutes[0].children = proAppRoutes;
          // router.addRoutes(this.filterDynamicRoutes(newRoutes)) // 后续若加入 permissions 权限校验,则使用此行代码
          router.addRoutes(newRoutes);
          // 在原路由的基础上清除、更新
          commit("REMOVE_SIDEBAR_ROUTES", "/project/data");
          commit("UPDATE_SIDEBAR_ROUTES", [newRoutes, 8]);
          resolve(newRoutes);
        });
      });
    },
}

注意

先清除后添加路由

src/store/modules/permission.js 中,GeneProAppRoutes 里没有 commit SET_SIDEBAR_ROUTERS 来直接更新 sidebarRouters,而是先 REMOVE_SIDEBAR_ROUTESUPDATE_SIDEBAR_ROUTES

原因是:若不先清除路由,则随着切换项目的增多,sidebarRouters 中会累计越来越多的路由,会报错。

动态路由页面刷新404

参考网上把 404 路由注释掉,就可解决。
但又产生了一个新问题,若输入错误路由地址,就不会显示 404 页面。

参考链接

  1. vue 动态路由 addRoutes 刷新页面404(空白)
  2. vue 使用addRoutes动态添加路由 跳转404路由的问题

标签:菜单,projectId,若依,state,SIDEBAR,sidebarRouters,newRoutes,路由,加载
From: https://www.cnblogs.com/shayloyuki/p/17443614.html

相关文章

  • 在树莓派上使用numpy实现简单的神经网络推理,pytorch在服务器或PC上训练好模型保存成nu
    这几天又在玩树莓派,先是搞了个物联网,又在尝试在树莓派上搞一些简单的神经网络,这次搞得是mlp识别mnist手写数字识别训练代码在电脑上,cpu就能训练,很快的:1importtorch2importtorch.nnasnn3importtorch.optimasoptim4fromtorchvisionimportdatasets,transfor......
  • 若依菜单改造(一):侧边栏显示不同菜单组
    需求点击菜单上某个图标,侧边栏的菜单项内容进行切换。效果如下:拆解需求:副标题:居中、可切换副标题下的菜单内容可切换。解决思路若依的菜单设置分为两种:在菜单管理中设置在router.js中书写公共路由或动态路由(根据用户权限加载)此处应该设置动态路由,方便根据......
  • NGINX 加载动态模块
    NGINX1.9.11开始增加加载动态模块支持,从此不再需要替换nginx文件即可增加第三方扩展。目前官方只有几个模块支持动态加载,第三方模块需要升级支持才可编译成模块。#./configure--help|grepdynamic--with-http_xslt_module=dynamicenabledynamicngx_http_xslt_modul......
  • 场景加载
    场景加载1.场景的基础操作1.1场景的创建场景创建的快捷键Ctrl+N可以快捷创建场景,此时创建的场景为临时场景,需要保存起来后续才能使用。1.2场景的删除直接在文件夹中进行删除即可,因为场景中可能会有一些依赖项,因此非必要不要删除场景。2.同步加载场景2.1切换场景使用的API:......
  • Pandas 加载数据的方法和技巧
    哈喽大家好,我是咸鱼相信小伙伴们在学习python数据分析的过程中或多或少都会听说或者使用过pandaspandas是python的一个拓展库,常用于数据分析今天咸鱼将介绍几个关于pandas导入数据的方法和技巧从URL获取csv数据关于pandas导入csv数据,使用的是下面这个方法pa......
  • VSTO添加右键菜单
    以Word为例privatevoidAddRightMenu(){Microsoft.Office.Core.CommandBarmzBar=appWord.CommandBars["Text"];//word文档已有的右键菜单TextMicrosoft.Office.Core.CommandBarmzBar=appExcel.CommandBars["cell"];......
  • 应用启动时加载application.properties配置文件
    配置aliyun.sms.regionId=defaultaliyun.sms.accessKeyId=LTAIxxxaliyun.sms.secret=PAxxxx importorg.springframework.beans.factory.InitializingBean;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.stereotype.Compone......
  • 普加项目管理中间件示例之六:自定义右键菜单
    弹出右键菜单时,根据当前选择的行,显示隐藏、启用禁用菜单项。示例地址:demo/DiyMenu.html代码如下://右键菜单弹出varmenu=newProjectMenu();project.setContextMenu(menu);menu.edit.on("click",function(e){ShowTaskWindow(project);});//监听菜单的opening事件,此......
  • java——微服务——spring cloud——Eureka——ribbon负载均衡——饥饿加载
       ......
  • win11改回win10右键菜单
    反人类Win11之文件右键菜单改回Win10GhostIT男​笔电/DIY配置分析&推荐|友好的交流从关注开始|欢迎私信 163人赞同了该文章使用win11,最大的问题是什么,是右键菜单很多时候需要点两次,实在是反人类,太麻烦了。必须使用“显示更多选项”的右键菜单:这......