React.createElement的作用是创建新的元素节点,也可以将字符串转换成元素节点
创建元素节点:
//***********两种方案完全等价
//方案一
{React.createElement(
collapsed ? MenuUnfoldOutlined : MenuFoldOutlined,
//会将下面对象中的属性写到元素的属性中
{className: 'trigger'}
)}
//方案二
<div>
{collapsed?
<MenuUnfoldOutlined className="trigger" }></MenuUnfoldOutlined>
:<MenuFoldOutlined className="trigger" }></MenuFoldOutlined>
}
</div>
将Antd图标字符串转化为图标组件
在不确定图标的情况下,只能将所有图标都引入
//引入所有图标
import * as Icons from '@ant-design/icons';
const Iconfont = (props) => {
//这里传入的props是一个对象,里面有icon属性,值是antd图标的名字
const { icon } = props
return React.createElement(Icons[icon])
}
export default Iconfont
将导航菜单中的icon转换成图标组件
// 处理菜单的图标
const handleMenuData = (list) => {
// 深拷贝防止污染原数据
let items = JSON.parse(JSON.stringify(list))
return items.map(item => {
//调用封装好的icon字符串转成组件的方法
item.icon = item.icon && <Iconfont icon={item.icon}></Iconfont>
//如果导航菜单中有子菜单需要用到递归的方式
item.children = item.children && handleMenuData(item.children)
return item
})
}
//最后得到的就是icon这一项的字符串转成了图标组件
handleMenuData(MenuList)