美文网首页
关于React 使用antd组件递归实现左侧菜单导航树(Menu

关于React 使用antd组件递归实现左侧菜单导航树(Menu

作者: 子喻爱吃黄焖鸡 | 来源:发表于2017-06-15 11:32 被阅读0次

    一、菜单组件Demo

    这里本人采用的是蚂蚁金服(antd)组件库里的{Menu}组件写的一个左侧菜单树的小Demo(整套开发环境是React+Redux+webpack)

    import React from 'react';
    import { Menu, Icon } from 'antd';
    import {WeaScroll} from 'ecCom';
    import {bindActionCreators} from 'redux';
    import {connect} from 'react-redux';
    import * as themeActions from '../../../actions/theme';
    const SubMenu = Menu.SubMenu;
    
    class E9LeftMenusTree extends React.Component{
    
        componentWillMount() {
        }
         
        //递归函数生成左侧菜单树
        //这里通过函数的形式,通过递归自身function的方式来生成菜单树的子菜单
        formSubmenusChild(obj){
            let cHtml=<div></div>;
            let childArray=obj.child;
            if("undefined"!=typeof(childArray)&&childArray.length>0) {
              cHtml = childArray.map((item, i) => {
                    return this.formSubmenusChild(item);
                });
                return <SubMenu key={obj.linkAddress} title={obj.name}>{cHtml}</SubMenu>
            }else{
                return <Menu.Item routeurl={obj.routeurl} key={obj.linkAddress}>{obj.name}</Menu.Item>
            }
    
    
        }
        handleClick(e) {
    
            const {actions}=this.props;
    
            let menuInfo={
                //打印antd Menu组件的onClick返回值(e)可以看出通过e.item.props来获取我们item组件的自定义属性
                routeurl:e.item.props.routeurl,
                url: e.key,
                target:'mainFrame'
            }
            //根据route路由地址和iframe地址的值判断使用哪个作为菜单页面展示方式
            actions.onLoadMain(menuInfo);
        }
    
        render() {
            const {columnMenuInfo,backEndMenuUrl} = this.props;
            let columnMenus=columnMenuInfo.toJSON();
            let html=columnMenus.map((obj,i)=> {
                if ("undefined"!=typeof(obj.child)&&obj.child.length>0) {
                    return this.formSubmenusChild(obj);
                } else {
                    //这里的routeurl是路由地址,是自定义的一个属性
                    return <Menu.Item routeurl={obj.routeurl} key={obj.linkAddress}>{obj.name}</Menu.Item>
                }
            });
    
            return (
                <Menu theme="dark"
                    onClick={this.handleClick.bind(this)}
                      style={{ width: 201}}
                      defaultOpenKeys={['sub1']}
                      selectedKeys={[backEndMenuUrl]}
                      mode="inline"
                >
                    {html}
                </Menu>
            )
        }
    }
    
    function mapStateToProps(state) {
        const {middleTheme} = state;
        return {
            backEndMenuUrl: middleTheme.get('backEndMenuUrl'),
            columnMenuInfo:middleTheme.get('columnMenuInfo')
        }
    }
    
    function mapDispatchToProps(dispatch) {
        return {
            actions: bindActionCreators(themeActions, dispatch)
        };
    }
    
    module.exports = connect(mapStateToProps, mapDispatchToProps)(E9LeftMenusTree);
    
    

    相关文章

      网友评论

          本文标题:关于React 使用antd组件递归实现左侧菜单导航树(Menu

          本文链接:https://www.haomeiwen.com/subject/njpyqxtx.html