React之动态渲染菜单(无状态机)

首先如果需要动态渲染菜单,并且根据不同用户获取不同的菜单,需要下面步骤:

我们动态渲染菜单需要使用递归的方式

1️⃣:首先用户的菜单都是从后端获取的,所以需要先发送请求,拿到菜单,然后将数据渲染到页面

代码:

newAxios.interceptors.request.use((req)=>{
    req.headers["Authori-zation"] = getToken(TOKEN_KEY)
    return req
})

❗:请求时,如果需要在请求头发送token,则按上面的格式。

首先根据用户获取菜单

然后将获取的菜单数据传给transformMenu函数

// 根据token获取用户的权限菜单
    const getMenus = async () => {
        const { data: data } = await $api.login.getMenus()
        console.log(data);
        let ary = transformMenu(data)
        setMenuitems(ary)
    }

2️⃣:   将后台数据转换成antdMenu所识别的数据

一般后端发送的数据,可能前端的UI库并不能识别,这时我们就需要将后端的数据进行一个转化。

封装一个transformMenu函数,这个函数将数据进行转换

const transformMenu = (list) => {
        return list.map(item=>{
            // 创建新的项对象
            let newMenu
            if(item.icon){
                newMenu = { label: item.name, key: item.component, icon: React.createElement(icons[item.icon]) }
            }else {
                newMenu = { label: item.name, key: item.component }
            }

            if (item.childList && item.childList.length > 0) {
                newMenu.children = transformMenu(item.childList)
            }
            return newMenu
        })
    }
    const go = () => {

    }

!!!注意:有的一级菜单有二级菜单,二级菜单可能没有三级菜单,有的或与有三级菜单,这时我们就需要做一个判断,  if (item.childList && item.childList.length > 0)  这里还需要对自己childList进行一个判断,如果不做这个判断,可能有的子级菜单为空,渲染时就会是空的,所以还要用子级的长度进行一个判断

- 我们创建一个对象,然后在这个对象里面自定义UI库所需要的属性。

- 数据转换完之后要用useState函数进行保存

3️⃣:将数据渲染到页面

   <Menu items={MenuItems} mode='inline' theme='dark' onClick={go}>

效果如图:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值