完美解决umi+ProLayout 部分菜单动态的问题

项目中用到这个框架,当然是很好用且方便的,但是实际使用的时候发现项目中限制了一些自定义内容,踩了几个坑,记录一下~
动态菜单调用接口异步,页面上显示空白

解决方案:将方法放在getInitialState中查询,存在initialState里,因为我的需求是route数据部分从接口中读取,所以在接口查询出数据后做了数据拼接。如果完全依赖后端给的接口来加载route,可以直接存res.data到initialState。


import type { Settings as LayoutSettings,MenuDataItem } from '@ant-design/pro-components';
import routes from '../config/routes';
import api from '@/services'

export async function getInitialState(): Promise<{
  route:MenuDataItem[],
}> {
  const data = await api.getTagTypeList({tag_type:'platform'}).then((res:any)=>{
    const routesArr = [...routes]
    const apiMarket = res.data.map(item=>{
      return{
        path:`${item.web_url}?tag_code=${item.tag_code}`,
        name:item.tag_name,
        component: './Market',
        icon:item.icon
      }
    })
    routesArr[routesArr.findIndex(item=>item.path=='market')].routes=apiMarket
    return routesArr
  })
  return {
    route:data,
  };
}
menu数据配置

这里以为返回一个对象即可,找了半天问题发现menu一定要按照格式来写。这里注意setting中如果设置menu无效果,可以把menu赋值放在数组后面,否则可能会被本身的menu覆盖。

    menu:{
      params: {
      },
      request: async (params, defaultMenuData: []) => {
        // 所以请问为什么一定要这样写才能出来??
        return initialState?.route
      },
    },
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您在 umi 中使用了 ProLayout 组件,但是路由菜单没有加载出来,可能是因为您没有正确配置路由信息。 请确保您在 umirc 中正确配置了路由信息,并在路由配置中包含了需要显示的菜单项。在 ProLayout 组件中,需要使用 menuData 属性来传递菜单数据。您可以在路由配置中添加 icon 和 name 等属性,然后在 menuData 中使用这些属性来显示菜单项。 以下是一个示例路由配置: ```javascript export default [ { path: '/', component: '@/layouts/ProLayout', routes: [ { path: '/home', name: '首页', icon: 'smile', component: '@/pages/Home', }, { path: '/about', name: '关于我们', icon: 'info-circle', component: '@/pages/About', }, ], }, ]; ``` 在 ProLayout 组件中,您需要使用 menuData 属性将路由信息传递给菜单组件。示例如下: ```javascript import ProLayout, { MenuDataItem } from '@ant-design/pro-layout'; import { useIntl, Link } from 'umi'; const BasicLayout: React.FC = (props) => { const { formatMessage } = useIntl(); return ( <ProLayout menuDataRender={(menuData: MenuDataItem[]) => menuData} menuItemRender={(item, dom) => ( <Link to={item.path}>{dom}</Link> )} > {props.children} </ProLayout> ); }; export default BasicLayout; ``` 在上述示例中,我们使用了 menuDataRender 属性来直接将路由配置传递给菜单组件。如果您需要对路由信息进行进一步处理,也可以在该属性中进行处理后再传递给菜单组件。在 menuItemRender 中,我们使用 Link 组件将菜单项转换为链接,从而实现点击菜单项后跳转到对应的页面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值