react 19版中路由react-router-dom v7版的利用

[复制链接]
发表于 2025-10-21 00:56:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

  • 路由的安装:
  1. npm install react-router-dom
复制代码
在src目次下建一个router文件夹
在router文件夹内里建一个index.tsx
index.tsx内容:
  1. import React from 'react';
  2. import {
  3.   BrowserRouter as Router,
  4.   Routes,
  5.   Route,
  6.   Link
  7. } from 'react-router-dom';
  8. import ManuList from './router';
  9. interface MenuItem {
  10.   title: string;
  11.   path: string;
  12.   icon?: string;
  13.   iconColor?: string;
  14.   component: React.ComponentType<any>; // 关键修正点:添加泛型参数
  15. }
  16. const IndexRouter: React.FC = () => {
  17.   return (
  18.     <Routes>
  19.       {ManuList.map((item: MenuItem) => (
  20.         <Route
  21.           key={item.path} // 使用 path 作为 key
  22.           path={item.path}
  23.           element={<item.component />} // 使用 element 属性并传递 React 元素
  24.         />
  25.       ))}
  26.     </Routes>
  27.   );
  28. };
  29. export default IndexRouter;
复制代码
再建一个router.tsx
  1. import Home from '../views/Home';
  2. import Article from '../views/Article';
  3. import Album from '../views/Album';
  4. import LinkPage from '../views/LinkPage';
  5. // 定义菜单项的类型
  6. interface MenuItem {
  7.     title: string;
  8.     path: string;
  9.     icon: string;
  10.     iconColor: string;
  11.     component: React.ComponentType; // 组件类型
  12. }
  13. const ManuList: MenuItem[] = [
  14.     {
  15.         title: '首页',
  16.         path: '/',
  17.         icon: '&#xe628;',
  18.         iconColor: '#ff08f5',
  19.         component: Home
  20.     },
  21.     {
  22.         title: '文章记录',
  23.         path: '/article',
  24.         icon: '&#xe660;',
  25.         iconColor: '#6a00fe',
  26.         component: Article
  27.     },
  28.     {
  29.         title: '相册',
  30.         path: '/album',
  31.         icon: '&#xe9f0;',
  32.         iconColor: '#005efe',
  33.         component: Album
  34.     },
  35.     {
  36.         title: '友情链接',
  37.         path: '/link',
  38.         icon: '&#xe693;',
  39.         iconColor: '#f50707',
  40.         component: LinkPage
  41.     }
  42. ];
  43. export default ManuList;
复制代码
app.tsx
  1. import './App.css'
  2. import { Layout } from 'antd';
  3. import HeaderSide from './common/index/header'
  4. const { Header, Content, Footer } = Layout;
  5. import IndexRouter from './router/index'
  6. function App() {
  7.   return (
  8.     <>
  9.       <Header className='shadow-lg py-8'>
  10.         <HeaderSide />
  11.       </Header>
  12.       <Content>
  13.         <IndexRouter />
  14.       </Content>
  15.       <Footer>
  16.       </Footer>
  17.     </>
  18.   )
  19. }
  20. export default App
复制代码
main.tsx:
  1. import { StrictMode } from 'react'
  2. import { createRoot } from 'react-dom/client'
  3. import './index.css'
  4. import App from './App.tsx'
  5. import 'virtual:uno.css'
  6. import { BrowserRouter } from 'react-router-dom'; // 引入 BrowserRouter
  7. const container = document.getElementById('root');
  8. const root = createRoot(container!); // 使用 createRoot
  9. root.render(
  10.   <StrictMode>
  11.     <BrowserRouter>
  12.       <App />
  13.     </BrowserRouter>
  14.   </StrictMode>
  15. );
复制代码
import HeaderSide from './common/index/header内里的代码:
  1. import logo from '@/assets/img/logo.svg';
  2. import ManuList from '../../router/router';
  3. import { useNavigate } from 'react-router-dom';
  4. function HeaderSide() {
  5.   const history = useNavigate();
  6.   const handleClick = (path: string) => {
  7.     history(path);
  8.   };
  9.   return (
  10.     <div className="app-header flex items-center">
  11.       <img src={logo} className="App-logo h-64" alt="logo" />
  12.       <ul className="flex items-center">
  13.         {
  14.           ManuList.map((item, index) => {
  15.             return <li
  16.               key={index}
  17.               className="mr-25 text-18 ml-20 cursor-pointer hover:text-blue-500"
  18.               onClick={() => handleClick(item.path)}>
  19.               <span
  20.                 className="iconfont mr-5"
  21.                 style={{ color: item.iconColor }}  
  22.                 dangerouslySetInnerHTML={{ __html: item.icon }}></span>
  23.               {item.title}
  24.             </li>
  25.           })
  26.         }
  27.       </ul>
  28.     </div>
  29.   )
  30. }
  31. export default HeaderSide
复制代码
注:在 React Router v7 中,不再利用 useHistory 钩子,React Router 采取了新的 API,此中包罗利用 useNavigate 钩子来代替 useHistory。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表