react ant-design实现导航菜单menu的路由设置/切换页面

本文介绍如何在Ant Design v6中配置导航菜单和页面路由,使用React Router DOM实现页面间的跳转,并展示了具体的代码实现。

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

ant-design版本是5.1.1,路由版本是v6的
新版本的导航菜单路由设置与旧版的不太一样,刚开始的时候甚至不知道该怎么写

实现效果:
在这里插入图片描述

代码:

import React, { useState } from 'react';
import {
  DesktopOutlined,
  EditFilled,
  PieChartOutlined,
} from '@ant-design/icons';
import { Breadcrumb, Layout, Menu, theme } from 'antd';
import { useNavigate, Routes, Route } from 'react-router-dom'
import "./App.css"

import Home from './pages/home';
import Charts from './pages/charts'

const { Header, Content, Footer, Sider } = Layout;
function getItem (label, key, icon, children) {
  return {
    key,
    icon,
    children,
    label,
  };
}
const items = [
  getItem('记账', '/home', <PieChartOutlined />),
  getItem('统计', '/charts', <DesktopOutlined />),
];
const App = () => {
  const [collapsed, setCollapsed] = useState(false);

  const navigate = useNavigate()

  const {
    token: { colorBgContainer },
  } = theme.useToken();

  const onClick = (e) => {
    navigate(e.key, { replace: true })
  }

  return (
    <Layout
      style={{
        minHeight: '100vh',
      }}
    >
      <Sider collapsible collapsed={collapsed} onCollapse={(value) => setCollapsed(value)}>
        <div className='title' >
          <EditFilled />
          <span style={{ marginLeft: 15 }}>记账管家</span>
        </div>
        <Menu theme="dark" defaultSelectedKeys={['1']} mode="inline" items={items} onClick={onClick} />
      </Sider>
      <Layout className="site-layout">
        <Header
          style={{
            padding: 0,
            paddingLeft: 30,
            background: colorBgContainer,
          }}
        >123</Header>
        <Content
          style={{
            margin: '0 16px',
          }}
        >
          <Breadcrumb
            style={{
              margin: '16px 0',
            }}
          >
            {/* <Breadcrumb.Item>User</Breadcrumb.Item>
            <Breadcrumb.Item>Bill</Breadcrumb.Item> */}
          </Breadcrumb>
          <div
            style={{
              padding: 24,
              minHeight: '75vh',
              background: colorBgContainer,
            }}
          >
            <Routes>
              <Route exact path="/home" element={<Home />} />
              <Route exact path="/charts" element={<Charts />} />
            </Routes>
          </div>
        </Content>
        <Footer
          style={{
            textAlign: 'center',
          }}
        >
          Ant Design ©2018 Created by Ant UED
        </Footer>
      </Layout>
    </Layout>
  );
};
export default App;

讲解:

首先,给导航菜单的menu添加点击事件

在这里插入图片描述

修改item,通过设置点击事件获取点击后的key值(key值即路由跳转的页面)

在这里插入图片描述
在这里插入图片描述

打印出来看看

在这里插入图片描述

获取到的key值就可以使用路由的useNavigate进行页面跳转了
导入路由
import { useNavigate, Routes, Route } from 'react-router-dom'
设置点击事件跳转

在这里插入图片描述

最后,设置页面路由出口(这里根据自己的需求设置对应的页面路由出口)

在这里插入图片描述

注意点:

如果出现报下面的错误,就是useNavigate是要在组件内才能使用,把对应的页面组件用<Router>包裹起来
在这里插入图片描述
其中,我的导航菜单是写在App.js里面的,所以我的App组件包裹就是在index.js里面
在这里插入图片描述
这样就算完成了页面的路由设置。

### 实现 ReactAnt Design Menu 组件的路由跳转 为了实现在使用 `React` 和 `Ant Design` 的 `Menu` 组件时进行有效的路由跳转,可以采用如下方法: #### 1. 安装依赖库 确保安装了必要的包来支持此功能。这通常涉及到两个核心库——`ant-design` 和 `react-router-dom`。 ```bash npm install antd react-router-dom ``` #### 2. 创建菜单项并绑定点击事件处理程序 通过定义一个函数,在其中调用 `useNavigate()` 来获取导航实例,并利用该实例执行页面间的转换操作[^1]。 ```jsx import React from 'react'; import { Menu } from 'antd'; import { useNavigate } from 'react-router-dom'; const MenuItem = ({ key }) => { let navigate = useNavigate(); function handleClick() { navigate(key); } return ( <Menu.Item onClick={handleClick} key={key}> Item {key} </Menu.Item> ); }; ``` #### 3. 配置应用级别的路由逻辑 在应用程序入口处引入 `Routes` 及其对应的 `Route` 元素,以便能够根据当前路径渲染相应的视图组件[^2]。 ```jsx // app.js 或 index.js 中 import React from 'react'; import { BrowserRouter as Router, Routes, Route } from 'react-router-dom'; import Home from './pages/Home'; // 假设这是首页组件 import About from './pages/About'; // 关于页组件 function App() { return ( <Router> <div className="App"> {/* ...其他布局 */} <Routes> <Route exact path="/" element={<Home />} /> <Route path="/about" element={<About />} /> {/* 更多路由配置... */} </Routes> {/* ...更多布局 */} </div> </Router> ); } export default App; ``` #### 4. 结合 Layout 使用 对于更复杂的应用结构,可能还需要创建一个通用的 `Layout` 组件,它包含了顶部栏、侧边栏等固定区域以及主要内容区。这样做的好处是可以方便地管理全局样式和共享资源,同时也简化了不同页面之间的切换过程[^3]。 ```jsx // layout.jsx import React from 'react'; import { Layout, Menu } from 'antd'; import SiderDemo from './components/SideBar'; // 自定义侧边栏组件 import ContentArea from './components/MainContent'; // 主体内容展示区 const { Header, Footer, Sider, Content } = Layout; class MyLayout extends React.Component { render() { return ( <Layout style={{ minHeight: '100vh' }}> <Header>头部</Header> <Layout> <Sider width={200} style={{ background: '#fff' }}> <SiderDemo /> </Sider> <Layout style={{ padding: '0 24px 24px' }}> <Content style={{ margin: '24px 16px', padding: 24, background: '#fff', minHeight: 280 }}> <ContentArea /> </Content> </Layout> </Layout> <Footer>底部</Footer> </Layout> ); } } export default MyLayout; ``` 上述方案展示了如何将 `Ant Design` 的 `Menu` 控件与 `react-router-dom` 整合起来完成基本的单页面应用开发需求。值得注意的是,实际项目中可能会遇到更加复杂的场景,比如权限控制下的条件性显示某些菜单选项或者异步加载远程数据作为菜单源等等情况,则需进一步扩展和完善现有代码框架[^4]。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值