React + Antd Menu组件实现菜单树

React与Antd构建菜单树
使用React和Antd的Menu组件,通过将后端返回的平级菜单数据转化为树形结构来实现菜单树。文章介绍了如何进行数据转换,并提供了一个递归生成菜单树的方法,同时展示了DOM结构和点击事件的绑定。

准备好两个变量,一个用来保存平级菜单列表,一个用来保存遍历后的菜单树。
推荐后端返回平级菜单树,假如菜单比较多,可以直接结合find方法找到菜单,做搜索功能很省事。

 const [menuList, setMenuList] = useState([]);

 const [treeMenuList, setTreeMenuList] = useState([]);

如果后端返回的是平级菜单树,则需要转化成树形结构,注意利用JSON方法进行深度克隆一下,防止影响原有数据

const treeList: any = listTransToTreeData(JSON.parse(JSON.stringify(userInfo.menus)), 'jd_dm', 'fjd_dm', 'children');

listTransToTreeData方法如下:

/**
 * 平级结构转树形结构
 *
 * 示例:const jsonDataTree = listTransToTreeData (jsonData, 'id', 'pid', 'chindren');
 * @param list 平级数据列表
 * @param idStr id的字符串
 * @param pidStr 父id字符串
 * @param chindrenStr children的字符串
 */
export const listTransToTreeData = (list: any, idStr: string, pidStr: string, chindrenStr: string) => {
  let r = [], hash: any = {}, id = idStr, pid = pidStr, children = chindrenStr, i = 0, j = 0, len = list.length;
  for (; i < len; i++) {
    hash[list[i][id]] = list[i];
  }
  for (; j < len; j++) {
    let aVal = list[j], hashVP = hash[aVal[pid]];
    if (hashVP) {
      !hashVP[children] && (hashVP[children] = []);
      hashVP[children].push(aVal);
    } else {
      r.push(aVal);
    }
  }
  return r;
}

准备一个递归生成菜单树的方法

  const getTreeMenu = (menuData: any) => {
    if (menuData.length > 0) {
      return menuData.map((item: any) => {
        if (item.children && item.children.length > 0) {
          return <SubMenu key={item.jd_dm} title={item.jd_mc} icon={<i className={`iconfont icon-${item.jd_icon}`}/>}>
                  {getTreeMenu(item.children)}
                </SubMenu>
        }
        return (
          <Menu.Item key={item.jd_dm}>{item.jd_mc}</Menu.Item>
        )
      })
    }
  }

DOM结构如下

<Menu onClick={menuHandleOk} mode="horizontal"
        style={{ width: 500, paddingTop: 12, height: 65 }} selectedKeys={selectedKeys}>
    { getTreeMenu(treeMenuList) }
  </Menu>

绑定的onclik事件

  const menuHandleOk = (e: any) => {
    const find: any = menuList.find((item: any) => item.jd_dm === e.key);
    console.log('menuItem', find);
  }
### 实现基于 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、付费专栏及课程。

余额充值