react之antd Menu三级菜单的展开收缩(永远只展开一个子集)

效果图


1587801516.png

]


1587801516(2).png
1587801516(1).png

菜单数据结构(menu.js)

      export default [
    {
        "id":0,
        "text":"首页",
        "state":"closed",
        "iconCls":"icon iconfont icon-shouye",
        "url":"/Layout/home"
    },
    {
        "id":1,
        "text":"账号/组织",
        "state":"closed",
        "iconCls":"icon iconfont icon-wode",
        "children":[
            {
                "id":100,
                "text":"仓库管理",
                "checked":false,
                "state":"closed",
                "iconCls":"icon iconfont icon-xiangqing",
                "url":"/Layout/productList"
            },
            {
                "id":101,
                "text":"部门信息",
                "checked":false,
                "state":"closed",
                "iconCls":"icon iconfont icon-xiangqing",
                "url":"/list01item02"
            },
            {
                "id":102,
                "text":"账号信息",
                "checked":true,
                "state":"closed",
                "iconCls":"icon iconfont icon-yonghuguanli",
                "children":[
                    {
                        "id":10201,
                        "text":"管理账号",
                        "checked":true,
                        "iconCls":"icon iconfont icon-zhanghuguanli",
                        "url":"/list01item03"
                    },
                    {
                        "id":10202,
                        "text":"商家账号",
                        "checked":true,
                        "iconCls":"icon iconfont icon-iconfontzhiweiguanli",
                        "url":"/list01item04"
                    },
                    {
                        "id":10203,
                        "text":"供应关系",
                        "checked":true,
                        "iconCls":"icon iconfont icon-guanxi",
                        "url":"/list01item05"
                    },
                    {
                        "id":10204,
                        "text":"领标授信",
                        "checked":true,
                        "iconCls":"icon iconfont icon-shouxin",
                        "url":"/list01item06"
                    },
                    {
                        "id":10205,
                        "text":"企业QQ",
                        "checked":true,
                        "iconCls":"icon iconfont icon-qq1",
                        "url":"/list01item07"
                    }
                ]   
            },
            {
                "id":103,
                "text":"权限/授权",
                "checked":true,
                "state":"closed",
                "iconCls":"icon iconfont icon-zhuxiao01",
                "children":[
                    {
                        "id":10301,
                        "text":"权限管理",
                        "iconCls":"icon iconfont icon-iconfontliebiao",
                        "url":"/list01item08"       
                    },
                    {
                        "id":10302,
                        "text":"授权模板",
                        "iconCls":"icon iconfont icon-iconfontmoban",
                        "url":"/list01item09"
                    }
                ]
            }
        ]   
    },
    {
        "id":2,
        "text":"基础配置",
        "iconCls":"icon iconfont icon-shezhi",
        "state":"closed",
        "checked":true,
        "children":[
            {
                "id":201,
                "text":"领标信息",
                "iconCls":"icon iconfont icon-xiaoxiguanli",
                "state":"closed",
                "checked":true,
                "children":[
                    {
                        "id":20101,
                        "text":"辅料管理",
                        "iconCls":"icon iconfont icon-wenjian",
                        "url":"list02item01"
                    },
                    {
                        "id":20102,
                        "text":"套标模板",
                        "iconCls":"icon iconfont icon-wenjian",
                        "url":"list02item02"
                    },
                    {
                        "id":20103,
                        "text":"套标管理",
                        "iconCls":"icon iconfont icon-wenjian",
                        "url":"list02item03"
                    }
                ]
            },
            {
                "id":202,
                "text":"业务配置",
                "iconCls":"icon iconfont icon-dingdanguanli2",
                "state":"closed",
                "checked":true,
                "children":[
                    {
                        "id":20201,
                        "text":"品牌",
                        "iconCls":"icon iconfont icon-wenjian",
                        "url":"list02item04"
                    },
                    {
                        "id":20202,
                        "text":"同步品牌",
                        "iconCls":"icon iconfont icon-wenjian",
                        "url":"list02item05"
                    },
                    {
                        "id":20203,
                        "text":"品牌国标码",
                        "iconCls":"icon iconfont icon-wenjian",
                        "url":"list02item06"
                    },
                    {
                        "id":20204,
                        "text":"单据说明",
                        "iconCls":"icon iconfont icon-wenjian",
                        "url":"page/list02/list02item07"
                    },
                    {
                        "id":20205,
                        "text":"审批流程",
                        "iconCls":"icon iconfont icon-wenjian",
                        "url":"page/list02/list02item08"
                    },
                    {
                        "id":20206,
                        "text":"店铺管理",
                        "iconCls":"icon iconfont icon-wenjian",
                        "url":"page/list02/list02item09"
                    },
                    {
                        "id":20207,
                        "text":"同步店铺",
                        "iconCls":"icon iconfont icon-wenjian",
                        "url":"page/list02/list02item10"
                    }
                ]
            },
            {
                "id":203,
                "text":"系统设置",
                "iconCls":"icon iconfont icon-shezhi1",
                "state":"closed",
                "checked":true,
                "children":[
                    {
                        "id":20301,
                        "text":"信息模板",
                        "iconCls":"icon iconfont icon-wenjian",
                        "url":"page/list02/list02item11"
                    },
                    {
                        "id":20302,
                        "text":"短信账户",
                        "iconCls":"icon iconfont icon-wenjian",
                        "url":"page/list02/list02item12"
                    },
                    {
                        "id":20303,
                        "text":"邮件账户",
                        "iconCls":"icon iconfont icon-wenjian",
                        "url":"page/list02/list02item13"
                    },
                    {
                        "id":20304,
                        "text":"企业QQ账户",
                        "iconCls":"icon iconfont icon-wenjian",
                        "url":"page/list02/list02item14"
                    },
                    {
                        "id":20305,
                        "text":"基础设置",
                        "iconCls":"icon iconfont icon-wenjian",
                        "url":"page/list02/list02item15"
                    },
                    {
                        "id":20306,
                        "text":"IP授权",
                        "iconCls":"icon iconfont icon-wenjian",
                        "url":"page/list02/list02item16"
                    },
                    {
                        "id":20307,
                        "text":"系统公告",
                        "iconCls":"icon iconfont icon-wenjian",
                        "url":"page/list02/list02item17"
                    },
                    {
                        "id":20308,
                        "text":"用户登录配置",
                        "iconCls":"icon iconfont icon-wenjian",
                        "url":"page/list02/list02item18"
                    },
                    {
                        "id":20309,
                        "text":"信息发送",
                        "iconCls":"icon iconfont icon-wenjian",
                        "url":"page/list02/list02item19"
                    }
                ]
            }
        ]
    }
]

加载数据(Menus.js)

  render(){
        const data = this.props.list;
        var html = [];
        for(var i=0;i<data.length;i++){
            if(data[i].children){
                var li = []
                for(var j=0;j<data[i].children.length;j++){
                    var liData = data[i].children[j];
                    if(liData.children){
                        var oli = [];
                        for(var k=0;k<liData.children.length;k++){
                            oli.push(
                                <Menu.Item key={liData.children[k].id}>
                                    <Link to={liData.children[k].url} replace>
                                        <i className={liData.children[k].iconCls}></i>
                                        <span>{liData.children[k].text}</span>
                                    </Link>
                                </Menu.Item>
                            )
                        }
                        var oul = <SubMenu key={liData.id} title={<span><i className={liData.iconCls}></i><span>{liData.text}</span></span>}>{oli}</SubMenu>;
                        li.push(oul);
                    }else{
                        li.push(
                            <Menu.Item key={liData.id}>
                                <Link to={liData.url} replace>
                                    <i className={liData.iconCls}></i>
                                    <span>{liData.text}</span>
                                </Link>
                            </Menu.Item>
                        );
                    }
                }
                var ul = <SubMenu key={data[i].id} title={<span><i className={data[i].iconCls}></i><span>{data[i].text}</span></span>}>{li}</SubMenu>;
                html.push(ul);
            }else{
                html.push(
                    <Menu.Item key={data[i].id}>
                        <Link to={data[i].url} replace>
                            <i className={data[i].iconCls}></i>
                            <span>{data[i].text}</span>
                        </Link>
                    </Menu.Item>
                )
            }
        }
        return (
            <Menu defaultSelectedKeys={['0']}
                openKeys={this.state.openKeys}
                onOpenChange={this.onOpenChange}
                mode="inline"
                theme="dark"
                collapsed={this.state.collapsed}>
                {html}
            </Menu>
        )
    }

计算SubMenu的key集合到数组rootSubmenuKeys,由于我们id是数字,SubMenu组件的key是字符串,+""转化数据类型

componentDidMount(props,nextProps){
        var data = this.props.list;
        for(var i=0;i<data.length;i++){
            if(data[i].children){
                for(var j=0;j<data[i].children.length;j++){
                    var liData = data[i].children[j];
                    if(liData.children){
                        this.state.rootSubmenuKeys.push(liData.id+"");
                    }
                }
                this.state.rootSubmenuKeys.push(data[i].id+"");
            }
        }
    }

展开收缩方法onOpenChange

onOpenChange = (openKeys) => {
        const latestOpenKey = openKeys.find(key => this.state.openKeys.indexOf(key) === -1);
        let openList;
        if(this.state.rootSubmenuKeys.indexOf(latestOpenKey) === -1) {
            if(latestOpenKey&&latestOpenKey.length===3){
                openList = this.state.openKeys.filter((e)=>{
                    return e.length!==3;
                })
                this.setState({
                    openKeys:openList
                });
            }else{
                this.setState({
                    openKeys:openKeys
                });
            }
           
        }else{
            if(latestOpenKey&&latestOpenKey.length===3){
                openList = this.state.openKeys.filter((e)=>{
                    return e.length!==3;
                })
                openList.push(latestOpenKey);
                this.setState({
                    openKeys:openList
                });
            }else{
                this.setState({
                    openKeys: latestOpenKey ? [latestOpenKey] : [],
                });
            }
            
        }
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 230,578评论 6 544
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,701评论 3 429
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 178,691评论 0 383
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,974评论 1 318
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,694评论 6 413
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 56,026评论 1 329
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 44,015评论 3 450
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 43,193评论 0 290
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,719评论 1 336
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,442评论 3 360
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,668评论 1 374
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 39,151评论 5 365
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,846评论 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 35,255评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,592评论 1 295
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,394评论 3 400
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,635评论 2 380

推荐阅读更多精彩内容