react项目:动态显示菜单列表--map() + 递归调用与使用reduce() + 递归调用

使用map() + 递归调用 导航部分index.jsx

import React ,{Component} from "react";
import {Link,withRouter} from 'react-router-dom'
import {Menu,Icon} from "antd";
import menuList from "../../config/menuConfig";
import {  FileOutlined } from '@ant-design/icons';
const { SubMenu } = Menu;
/*
* 左侧导航组件
* */
class LeftNav extends Component {
    /*
    * 根据menu的数据数组生成对于标签数组
    * 使用map() + 递归调用
    * */
     getMenuNodes_map = (menuList) =>{
         return menuList.map(item=>{
             if(!item.children){
                 return(
                    <Menu.Item key ={item.key} icon={<FileOutlined/>} defaultSelectedKeys={['1']}>
                         <Link to={item.key}>
                            <Icon type={item.icon}/>
                             <span>{item.title}</span>
                         </Link>
                     </Menu.Item>
                 )
             }else{
                 return(
                     <SubMenu key={item.key}  title={
                         <span>
                              {<FileOutlined/>}
                             <span>{item.title}</span>
                         </span>
                     }>
                         {this.getMenuNodes(item.children)}
                     </SubMenu>
                )
            }
        })
     }
    render() {
        // debugger
        // const menuNodes = this.getMenuNodes(menuList);
        // //得到当前请求的路由路径
        const path = this.props.location.pathname;
        //得到需要打开菜单项的key
        const openKey = this.openKey;

     return(
         <div>
             <div className="logo"/>
             <Menu theme="dark"
                   selectedKeys={path}
                   defaultOpenKeys={[openKey]}
                   mode="inline">
                     // this.menuNodes
                     this.getMenuNodes(menuList)  //获取menu的所有子节点
                 }
             </Menu>
         </div>
     )
 }
}

//withRouter高阶组件:
// 包装非路由组件,返回一个新的组件
// 新的组件向非路由组件传递三个属性history/location/match
export default withRouter(LeftNav)

使用reduce()+ 递归调用 导航部分index.jsx

import React ,{Component} from "react";
import {Link,withRouter} from 'react-router-dom'
import {Menu,Icon} from "antd";
import menuList from "../../config/menuConfig";
import {  FileOutlined } from '@ant-design/icons';
const { SubMenu } = Menu;
/*
* 左侧导航组件
* */
class LeftNav extends Component {
    //  * 根据menu的数据数组生成对于标签数组
    //  * 使用reduce() + 递归调用
    getMenuNodes = (menuList) =>{
        return menuList.reduce((pre,item) =>{
            if (!item.children) {
                //向pre中添加<Menu.Item>
                pre.push((
                    <Menu.Item key ={item.key} icon={<FileOutlined/>}>
                        <Link to={item.key}>
                            <Icon type={item.icon}/>
                            <span>{item.title}</span>
                        </Link>
                    </Menu.Item>
                ))
            }else{
                //向pre中添加<SubMenu>
                pre.push((
                    <SubMenu key={item.key}  title={
                        <span>
                             {<FileOutlined/>}
                            <span>{item.title}</span>
                        </span>
                    }>
                        {this.getMenuNodes(item.children)}
                    </SubMenu>
                ))
            }

            return pre;
        },[])
    }
    render() {
        // debugger
        // const menuNodes = this.getMenuNodes(menuList);
        // //得到当前请求的路由路径
        const path = this.props.location.pathname;
        //得到需要打开菜单项的key
        const openKey = this.openKey;

     return(
         <div>
             <div className="logo"/>
             <Menu theme="dark"
                   selectedKeys={path}
                   defaultOpenKeys={[openKey]}
                   mode="inline">
             
                 {
                     // this.menuNodes
                     this.getMenuNodes(menuList)  //获取menu的所有子节点
                 }
             </Menu>
         </div>
     )
 }
}

//withRouter高阶组件:
// 包装非路由组件,返回一个新的组件
// 新的组件向非路由组件传递三个属性history/location/match
export default withRouter(LeftNav)

config文件夹下menuConfig.js

const menuList = [
    {
        title:'首页',  //菜单标题名称
        key:'/home', //对应的path
        icon:'TeamOutlined',//图标名称
    },
    {
        title:'用户信息',
        key:'/user',
        icon:'TeamOutlined',
    },
    {
        title:'图片管理',
        key:' ',
        icon:'pic',
        children:[
            {
                title:'图片信息',
                key:'/pic',
            }
        ]
    }
]
export default menuList

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值