react+antd menu实现无限级菜单

本文介绍如何使用JavaScript处理后端返回的数组数据,通过menuRecursion函数实现菜单的无限级嵌套,以Ant Design的Menu和SubMenu组件为例,展示了如何在前端渲染出动态的菜单结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求是后端会返回一个数组,需要生成一个无限级嵌套的菜单,类似

[
    {id:'1',name:'建筑物',parentId:'-1'},
    {id:'2',name:'居民楼',parentId:'1'},
    {id:'3',name:'办公楼',parentId:'1'},
    {id:'4',name:'棚户',parentId:'1'},
    {id:'5',name:'三极目录',parentId:'4'},
    {id:'6',name:'电力设施',parentId:'-1'},
    {id:'7',name:'abc',parentId:'-1'},
    {id:'8',name:'cc',parentId:'7'},
]

parentId为父级菜单的id,不多说,上代码

//菜单无限级递归函数
    menuRecursion = menu => {
        let treeData =[]
        let map = {}
        menu.forEach(item => {
            map[item.id] = item
        })
        menu.forEach(item => {
            let parent = map[item.parentId]
            if(parent){
                (parent.children || (parent.children=[])).push(item)
            }else{
                treeData.push(item)
            }
        })
        this.setState({
            menuList:treeData
        })
    }

结构部分如下,需要导入antd 的Menu和SubMenu,

menuRender = menu => 
        menu.map(item =>{
            if(item.children?.length>0) {
                return(
					<SubMenu
                        key= {item.id}
                        title={
                            <div>
                                <span>{item.name}</span>    
                            </div> 
                        }
                    >
                        {
                            this.menuRender(item.children)
                        }
                    </SubMenu>
                )
            }
            return(
                <Menu.Item
                    key={item.id}
                >
                    <span>{item.name}</span>
                </Menu.Item>
            )
    })

在Menu标签里调用即可

<Menu mode="inline">
  {this.menuRender(this.state.menuList)}
</Menu>

最后效果如图,不论返回的数组需要无限多级的子菜单嵌套都没有问题,希望能帮到正在需要帮助的朋友。

### 实现基于 Next.js 和 Ant Design 的导航菜单 为了创建一个功能齐全的导航菜单,可以利用 `next/link` 组件来处理页面间的跳转,并结合 Ant Design 提供的 `Menu` 组件完成样式设计。 #### 安装依赖库 首先,在项目根目录下安装所需的 npm 包: ```bash npm install antd next react-dom @ant-design/icons ``` #### 创建导航栏组件 定义一个新的 React 组件用于展示顶部导航条。这里引入了 Ant Design 中的 `Menu`, 并通过配置其属性来自定义外观和行为。 ```jsx // components/TopNav.jsx import Link from 'next/link'; import { Layout, Menu } from 'antd'; const { Header } = Layout; const TopNav = () => ( <Header> <div className="logo" /> <Menu theme="dark" mode="horizontal" defaultSelectedKeys={['1']}> <Menu.Item key="home"> <Link href="/"> Home </Link> </Menu.Item> <Menu.Item key="about"> <Link href="/about"> About Us </Link> </Menu.Item> {/* Add more items here */} </Menu> </Header> ); export default TopNav; ``` #### 将导航栏集成到布局文件中 为了让整个应用程序都能访问这个公共头部区域,可以在 `_app.js` 或者单独建立的一个全局布局文件里加入 `<TopNav />`. ```jsx // pages/_app.js or layouts/MainLayout.jsx import '../styles/globals.css' import type { AppProps } from 'next/app' import Head from 'next/head'; import TopNav from '../components/TopNav'; function MyApp({ Component, pageProps }: AppProps) { return ( <> <Head> <title>My Website</title> </Head> <TopNav /> <Component {...pageProps} /> </> ); } export default MyApp; ``` 上述代码片段展示了如何使用 Next.js 结合 Ant Design 来构建响应式的导航菜单[^1]。此方法不仅能够提供良好的用户体验,同时也简化了开发流程中的路由管理部分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值