antd-pro(V5)动态菜单

本文介绍了如何在Ant Design Pro中动态生成菜单,通过`menuDataRender`配置根据用户登录信息从后端获取并处理菜单数据。首先,设置menuDataRender返回空数组验证配置生效,然后定义`menuDataRender`方法,解析和转换用户权限数据,根据用户角色隐藏或显示菜单项和按钮。示例代码展示了如何处理和转换权限字段,并根据权限决定菜单和按钮的显示。
摘要由CSDN通过智能技术生成

一般情况下登录系统后菜单是由后端返回的,不是前端写死的。antd-pro也支持,修改的路径在app.tsx

在 layout 里加一个menuDataRender字段先给一个() =>[]可以看到左侧菜单没了,说明配置生效了,接下来就可以围绕这个配置做文章了,我们先定义一个 menuDataRender方法。根据登录缓存到本地的数据做下处理,判断菜单里要展示哪些内容(比如替换字段,隐藏不显示的菜单,隐藏按钮等),处理好了后返回一个数组结构即可。

示例代码如下

export const layout: RunTimeLayoutConfig = ({ initialState }) => {
  return {
	...
    menuDataRender: () => menuDataRender(),
  	...
  };
};

const menuDataRender: any = () => {
  // 如果没有用户信息就展示空菜单
  const loginInfo = sessionStorage.getItem('loginInfo');
  if (!loginInfo) {
    return [];
  }
  const currentUser = JSON.parse(loginInfo || '{}');
  const { permissions } = currentUser.roleList[0];
  // 字段转换为要求字段
  let str = JSON.stringify(permissions);
  str = str.replace(/"permissionName":/g, '"name":');
  str = str.replace(/"permissionCode":/g, '"path":');
  str = str.replace(/"childPermissionList":/g, '"routes":');
  str = str.replace(/"isShow":false/g, '"hideInMenu":true');//不显示的菜单设置过滤
  const data = JSON.parse(str);
  data.forEach((item: any) => {
    spliceBtn(item);
  });
  return data;
};

// 判断是页面还是按钮
const spliceBtn = (obj: any) => {
  const item = obj;
  // 先获取所有的权限
  if (item.routes instanceof Array && item.routes.length > 0) {
    item.routes.forEach((item2: any) => {
      spliceBtn(item2);
    });
    //这里是判断该节点是页面还是按钮 需要根据项目的具体的情况来判断(比如后端直接给你指定了是按钮还是页面)
    const result = item.routes.every((item2: any) => {
      return Array.prototype.isPrototypeOf(item2.routes) && item2.routes.length === 0;
    });
    item.path = `/${item.path}`;
    if (result) {
      item.hideChildrenInMenu = true; //如果下层全是按钮就不隐藏子元素
    }
  }
};

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值