## react + antd实现动态菜单
import React, { Component } from 'react';
import { Menu } from 'antd';
import history from '../../router/history';
const { SubMenu } = Menu;
interface Props {
}
type stateType = {
menuList: {}[]
}
type itemType = {
id: '',
path: '', // 页面跳转路劲
title: '', // 菜单名称
icon: '', // 图标
show: boolean, // 是否显示该菜单
children: [] // 子级菜单
}
// 模拟数据
const mList = [
{
id: '01',
path: '',
title: '用户管理',
icon: '',
show: true,
children: [
{
id: '0101',
path: '',
title: '个人信息',
icon: '',
show: true,
children: [
{
id: '010101',
path: '',
title: '基本信息',
icon: '',
show: true,
children: []
},
{
id: '010102',
path: '',
title: '附加信息',
icon: '',
show: false,
children: []
}
]
}
]
},
{
id: '01',
path: '',
title: '角色管理',
icon: '',
show: false,
children: []
}
]
class SiderLeft extends Component<Props, stateType> {
constructor(props) {
super(props);
console.log('props', props);
this.state = {
menuList: mList
}
this.renderMenuItem.bind(this);
}
renderMenuItem(navList: {}[]) {
return navList.map((item: itemType, index: number) => {
if(item.children && item.children.length){
return item.show ? <SubMenu key={item.id + index} title={item.title}>
{ this.renderMenuItem(item.children) }
</SubMenu> : null
}
return item.show ? <Menu.Item key={item.id + index} onClick={() => { history.push(item.path) }}>{item.title}</Menu.Item> : null
})
}
render() {
return (
<Menu theme="dark" mode="inline">
{
this.state.menuList.map((item: itemType, index: number) => {
if(item.children && item.children.length){
return item.show ? <SubMenu key={item.id + index} title={item.title}>
{ this.renderMenuItem(item.children) }
</SubMenu> : null
}
return item.show ? <Menu.Item key={item.id + index} onClick={() => { history.push(item.path) }}>{item.title}</Menu.Item> : null
})
}
</Menu>
);
}
}
export default SiderLeft;
history.js
import { createHashHistory } from 'history';
const history = createHashHistory();
export default history;
浙公网安备 33010602011771号