当前位置: 首页 > article >正文

ant design pro + umi4的动态菜单与动态路由

困扰我好多天的自定义菜单及路由终于完成了,首先虽然看似为一个功能,但在umi4中是两项配置。

先说说我浪费了大量时间使用的处理方式:因为曾经的项目是umi3的,所以我就想原样搬过来,结果发现,布局页BasicLayout的子children不见了!

 

 

如果这个子路由能正常显示,那引个ProLayout也就不用大费周章找其他方法。参考:https://blog.csdn.net/eisha2015/article/details/114831390

后来,我又找到了umi的patchRoutes,但发现怎么重写路由,菜单都没有变化。参考:https://blog.csdn.net/weixin_43294560/article/details/107447241

最后还是翻到ProComponents菜单的高级用法,才发现菜单直接在app.tsx里配置就行了,相当于这个文件就是当初的ProLayout。

之后还将子路由routes为[]时,把父结点也清除的数据处理,以及使用patchClientRoutes来修改默认路由跳转,而原本routes.ts配置的路转就可以删除了。

所以修改的代码如下:

type Router = {
  name?: string,
  path: string,
  icon?: string | React.ReactNode,
  routes?: Router[],
  component?: string,
  redirect?: string,
}

// routes为[],则删除结点
const deleteroutes = (arr: Router[]) => {
  let childs = arr
  for (let i = childs.length; i--; i > 0) {
    const routes = childs[i].routes;
    if (routes) {
      if (routes.length) {
        // 处理antd的图标,全部引入包的大小爆增,不如用iconfontUrl
        // const icon = childs[i].icon;
        // if (typeof icon === 'string') {
        //   childs[i].icon = React.createElement(Icons[icon]);
        // }
        deleteroutes(routes);
      } else {
        delete childs[i];
      }
    }
  }
  return JSON.parse(JSON.stringify(arr).replace(/null,/g, '').replace(/,null/g, '')) as Router[];
}

let extraRoutes: Router[];
export const patchClientRoutes = ({ routes }: any) => {
  const r = extraRoutes;
  const to = r![0].routes![0].routes![0].path;
  routes.unshift({
    path: '/',
    element: <Navigate to={to || ''} replace />,
  });
  r.forEach(element => {
    routes.unshift({
      path: element.path,
      element: <Navigate to={element.routes![0].routes![0].path} replace />,
    });
  });
};

export function render(oldRender: any) {
  setTimeout(() => {
    extraRoutes = deleteroutes([{
      name: '一级菜单A',
      path: '/a',
      routes: [
        {
          name: '二级菜单AA',
          path: '/a/aa',
          icon: 'icon1',
          routes: [
          ],
        },
        {
          name: '二级菜单BB',
          path: '/a/bb',
          icon: 'icon2',
          routes: [
            {
              name: '三级菜单AAA',
              path: '/a/aa/aaa',
              component: './a/aa/aaa',
            },
            {
              name: '三级菜单BBB',
              path: '/a/aa/bbb',
              component: './a/aa/bbb',
            },
          ],
        },
      ]
    },
    {
      name: '一级菜单B',
      path: '/b',
      routes: [
      ],
    }]);
    oldRender();
  }, 1000);
}

export const layout: RunTimeLayoutConfig = ({ initialState, setInitialState }) => {
  return {
    menu: {
      // 每当 initialState?.currentUser?.userid 发生修改时重新执行 request
      // params: {
      //   userId: initialState?.currentUser?.userid,
      // },
      request: async (params, defaultMenuData) => {
        return extraRoutes;
      }
    },
    .......
  };
};


http://www.kler.cn/news/9687.html

相关文章:

  • 带你玩转Python爬虫(胆小者勿进)千万别做坏事·······
  • 明明有index.jsp文件访问的时候却显示404
  • 指针C语言基础代码总结
  • 图嵌入 Node2Vec
  • 前端开发必看100道大厂面试题集锦(一)
  • 网站怎么接入chatGPT来自动写文章
  • python【反爬、xpath解析器、代理ip】
  • ZooKeeper领导者选举流程
  • 子集和问题
  • 华为OD机试-通信误码-2022Q4 A卷-Py/Java/JS
  • 【教程】解决VSCode中Python第三方库无法自动补全
  • Segment Anything论文阅读笔记
  • HummerRisk 使用教程:操作审计
  • Qt·核心机制
  • 商汤科技推出“日日新SenseNova”,大模型体系赋能人工智能新未来
  • Elasticsearch:ESQL 简介 — 一种用于灵活、迭代分析的新查询语言
  • 使用模板窗口生成测试数据
  • TypeScript由浅到深(上篇)
  • 工程管理系统软件 自主研发,工程行业适用
  • 【国内chatgpt最全使用方法合集】(总有一个适合你)
  • GaussDB行存储表列存储表相关
  • 本地安装WSL的发行版后,导出到另一台计算机安装的办法
  • 自然语言处理(七): Deep Learning for NLP: Recurrent Networks
  • Python第三方库安装
  • 人脑体内扩散张量分布MRI的新框架
  • Diffusion模型系列文章
  • midjourney注册教程
  • 浏览器表单自动填充调研
  • 企业资源规划(ERP)监控工具
  • Python 进阶指南(编程轻松进阶):一、处理错误和寻求帮助