antd menu 支持层级折叠

import { Menu } from "antd";

import "antd/dist/antd.css";

import React, { useState, useEffect } from "react";

const list = [

{

title: "One",

key: "one",

children: [

{

title: "One_1",

key: "one_1",

children: [

{

title: "One_1_1",

key: "one_1_1"

},

{

title: "One_1_2",

key: "one_1_2"

}

]

},

{

title: "One_2",

key: "one_2",

children: [

{

title: "One_2_1",

key: "one_2_1"

},

{

title: "One_2_2",

key: "one_2_2"

}

]

},

{

title: "One_3",

key: "one_3"

}

]

}

];

export default function App() {

const [selectedKeys, setSelectedKeys] = useState([]);

const [openKeys, setOpenKeys] = useState([]);

useEffect(() => {

init(list);

}, []);

const init = (data, openKeys = []) => {

const obj = data[0];

if (obj.children) {

openKeys.push(obj.key);

return init(obj.children, openKeys);

}

setOpenKeys(openKeys);

setSelectedKeys([obj.key]);

};

const renderDom = (dom, f = []) => {

if (dom.children) {

return (

<Menu.SubMenu

title={dom.title}

key={dom.key}

onTitleClick={() => {

if (openKeys.includes(dom.key)) {

const keys = [...f];

const index = f.findIndex((item) => item === dom.key);

keys.splice(index, 1);

setOpenKeys(keys);

} else {

setOpenKeys([...f, dom.key]);

}

}}

>

{dom.children.map((item) => renderDom(item, [...f, item.key]))}

</Menu.SubMenu>

);

}

return <Menu.Item key={dom.key}>{dom.title}</Menu.Item>;

};

return (

<Menu

style={{ width: "200px" }}

mode="inline"

openKeys={openKeys}

selectedKeys={selectedKeys}

onClick={({ key }) => setSelectedKeys([key])}

>

{list.map((item) => renderDom(item, [item.key]))}

</Menu>

);

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值