react17+antd4 动态渲染导航菜单中的icon

在路由信息对照表中的icon可以有两种形式:一种是组件形式,一种是字符串形式的。
在antd4的Menu.Item和SubMenu中的icon属性的格式为:
在这里插入图片描述

1.组件形式

这种方法在渲染时很方便,与antd中的Menu.Item中的icon属性的形式是一致的,可以直接进行渲染。

路由信息对照表:

//路由信息对照表
import {HomeOutlined,UserOutlined,UsergroupAddOutlined} from '@ant-design/icons'
export const asyncRouterMap = [
    {
        path: '/home',
        name: 'Home',
        meta: { title: '首页', role: ['admin', 'teacher', 'manager'],icon:<HomeOutlined />}
    }, {
        path: '/personal',
        name: "Personal",
        meta: { title: '个人中心', role: ['admin', 'teacher', 'manager'],icon:<UserOutlined />}
    }, {
        path: '/teacher',
        name: "Teacher",
        meta: { title: '教师管理', role: ['admin'],icon:<UsergroupAddOutlined /> }
    }, 
}

菜单渲染:

   //菜单渲染
   renderMenu = (data) => {
       return data.map((item) => {
           if (item.children) {
               return <SubMenu key={item.path} title={item.meta.title} icon={item.meta.icon}>
                   {this.renderMenu(item.children)}
               </SubMenu>
           }else{
               return <Menu.Item key={item.path} icon={icon}>
                   <NavLink to={'/index' + item.path}>{item.meta.icon}</NavLink>
               </Menu.Item>
           }
       })
   }

2.字符串形式

在项目中很多时候传入的icon都是字符串类型的,与antd的Menu.Item和SubMenu的icon属性不一致,需要使用React.createElement将其转换为reactNode类型的。

import * as Icon from "@ant-design/icons" //引入*以满足动态渲染
... ...
list.map(item=>{
   item.icon = React.createElement(Icons[item.icon])
})

路由信息对照表:

export const asyncRouterMap = [
    {
        path: '/home',
        name: 'Home',
        meta: { title: '首页', role: ['admin', 'teacher', 'manager'],icon:'HomeOutlined'}
    }, {
        path: '/personal',
        name: "Personal",
        meta: { title: '个人中心', role: ['admin', 'teacher', 'manager'],icon:'UserOutlined'}
    }, {
        path: '/teacher',
        name: "Teacher",
        meta: { title: '教师管理', role: ['admin'],icon:'UsergroupAddOutlined' }
    }, 
}

菜单渲染:

	import * as Icons from '@ant-design/icons'  //引入*以满足动态渲染
    renderMenu = (data) => {
        return data.map((item) => {
            const icon=React.createElement(Icons[item.meta.icon],{style:{fontSize:'20px'}}) //创建元素
            if (item.children) {
                return <SubMenu key={item.path} title={item.meta.title} icon={icon}>
                    {this.renderMenu(item.children)}
                </SubMenu>
            }else{
                return <Menu.Item key={item.path} icon={icon}>
                    <NavLink to={'/index' + item.path}>{item.meta.title}</NavLink>
                </Menu.Item>
            }
        })
    }

参考内容:ant5中,menu组件动态渲染icon问题

相关推荐

  1. 高版本ant-design动态引用icon

    2024-04-13 22:12:02       34 阅读
  2. 安卓11菜单实现hdmi-4K动态切换

    2024-04-13 22:12:02       28 阅读
  3. Reactantd使用技巧

    2024-04-13 22:12:02       31 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-13 22:12:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-13 22:12:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-13 22:12:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-13 22:12:02       20 阅读

热门阅读

  1. 18. Linux API 编程预备知识

    2024-04-13 22:12:02       14 阅读
  2. 【应用】Spring-Bean注入-xml+注解

    2024-04-13 22:12:02       15 阅读
  3. skynet中newservice和uniqueservice的区别

    2024-04-13 22:12:02       15 阅读
  4. ChatGPT革新学术写作:论文撰写的新思路

    2024-04-13 22:12:02       18 阅读
  5. shell脚本启动jar包

    2024-04-13 22:12:02       14 阅读
  6. C语言隐藏执行其他程序

    2024-04-13 22:12:02       14 阅读
  7. openjudge_2.5基本算法之搜索_1756:八皇后

    2024-04-13 22:12:02       12 阅读
  8. 预训练的启蒙:浅谈BERT、RoBERTa、ALBERT、T5

    2024-04-13 22:12:02       14 阅读
  9. P1085 [NOIP2004 普及组] 不高兴的津津

    2024-04-13 22:12:02       14 阅读
  10. 前端面试复习大纲

    2024-04-13 22:12:02       14 阅读
  11. 单片机家电产品--OC门电路

    2024-04-13 22:12:02       17 阅读
  12. 岛屿个数(dfs)

    2024-04-13 22:12:02       11 阅读
  13. 用户层read write io命令到NVMe SSD全流程

    2024-04-13 22:12:02       13 阅读