## 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;