小工具知识网

当前位置: 首页 > 行业知识 > ant design pro + umi4的动态菜单与动态路由

行业知识

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

2026-10-28 05:13:17 来源:互联网转载

困扰我好多天的自定义菜单及路由终于完成了,首先虽然看似为一个功能,但在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: ,  });  r.forEach(element => {    routes.unshift({      path: element.path,      element: ,    });  });};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;      }    },    .......  };};

上一篇:攻击服务器入狱怎么处理?

下一篇:晚上几点用英文怎么表示?