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

  1. 路由的安装:
javascript 复制代码
npm install react-router-dom

在src目录下建一个router文件夹

在router文件夹里面建一个index.tsx

index.tsx内容:

javascript 复制代码
import React from 'react';
import {
  BrowserRouter as Router,
  Routes,
  Route,
  Link
} from 'react-router-dom';
import ManuList from './router';

interface MenuItem {
  title: string;
  path: string;
  icon?: string;
  iconColor?: string;
  component: React.ComponentType<any>; // 关键修正点:添加泛型参数
}

const IndexRouter: React.FC = () => {
  return (
    <Routes>
      {ManuList.map((item: MenuItem) => (
        <Route
          key={item.path} // 使用 path 作为 key
          path={item.path}
          element={<item.component />} // 使用 element 属性并传递 React 元素
        />
      ))}
    </Routes>
  );
};

export default IndexRouter;

再建一个router.tsx

javascript 复制代码
import Home from '../views/Home';
import Article from '../views/Article';
import Album from '../views/Album';
import LinkPage from '../views/LinkPage';

// 定义菜单项的类型
interface MenuItem {
    title: string;
    path: string;
    icon: string;
    iconColor: string;
    component: React.ComponentType; // 组件类型
}

const ManuList: MenuItem[] = [
    {
        title: '首页',
        path: '/',
        icon: '&#xe628;',
        iconColor: '#ff08f5',
        component: Home
    },
    {
        title: '文章记录',
        path: '/article',
        icon: '&#xe660;',
        iconColor: '#6a00fe',
        component: Article
    },
    {
        title: '相册',
        path: '/album',
        icon: '&#xe9f0;',
        iconColor: '#005efe',
        component: Album
    },
    {
        title: '友情链接',
        path: '/link',
        icon: '&#xe693;',
        iconColor: '#f50707',
        component: LinkPage
    }
];
export default ManuList;

app.tsx

javascript 复制代码
import './App.css'
import { Layout } from 'antd';
import HeaderSide from './common/index/header'
const { Header, Content, Footer } = Layout;
import IndexRouter from './router/index'
function App() {
  return (
    <>
      <Header className='shadow-lg py-8'>
        <HeaderSide />
      </Header>
      <Content>
        <IndexRouter />
      </Content>
      <Footer>
      </Footer>
    </>
  )
}

export default App

main.tsx:

javascript 复制代码
import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import './index.css'
import App from './App.tsx'
import 'virtual:uno.css'
import { BrowserRouter } from 'react-router-dom'; // 引入 BrowserRouter
const container = document.getElementById('root');
const root = createRoot(container!); // 使用 createRoot

root.render(
  <StrictMode>
    <BrowserRouter>
      <App />
    </BrowserRouter>
  </StrictMode>
);

import HeaderSide from './common/index/header里面的代码:

javascript 复制代码
import logo from '@/assets/img/logo.svg';
import ManuList from '../../router/router';
import { useNavigate } from 'react-router-dom';
function HeaderSide() {
  const history = useNavigate();

  const handleClick = (path: string) => {
    history(path);
  };
  return (
    <div className="app-header flex items-center">
      <img src={logo} className="App-logo h-64" alt="logo" />
      <ul className="flex items-center">
        {
          ManuList.map((item, index) => {
            return <li 
              key={index} 
              className="mr-25 text-18 ml-20 cursor-pointer hover:text-blue-500"
              onClick={() => handleClick(item.path)}>
              <span 
                className="iconfont mr-5"
                style={{ color: item.iconColor }}  
                dangerouslySetInnerHTML={{ __html: item.icon }}></span>
              {item.title}
            </li>
          })
        }
      </ul>
    </div>
  )
}
export default HeaderSide

注:在 React Router v7 中,不再使用 useHistory 钩子,React Router 采用了新的 API,其中包括使用 useNavigate 钩子来代替 useHistory。

相关推荐
TeleostNaCl1 小时前
解决 Chrome 无法访问网页但无痕模式下可以访问该网页 的问题
前端·网络·chrome·windows·经验分享
前端大卫3 小时前
为什么 React 中的 key 不能用索引?
前端
你的人类朋友3 小时前
【Node】手动归还主线程控制权:解决 Node.js 阻塞的一个思路
前端·后端·node.js
小李小李不讲道理4 小时前
「Ant Design 组件库探索」五:Tabs组件
前端·react.js·ant design
毕设十刻5 小时前
基于Vue的学分预警系统98k51(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末
前端·数据库·vue.js
mapbar_front5 小时前
在职场生存中如何做个不好惹的人
前端
牧杉-惊蛰6 小时前
纯flex布局来写瀑布流
前端·javascript·css
一袋米扛几楼987 小时前
【软件安全】什么是XSS(Cross-Site Scripting,跨站脚本)?
前端·安全·xss
向上的车轮7 小时前
Actix Web适合什么类型的Web应用?可以部署 Java 或 .NET 的应用程序?
java·前端·rust·.net
XiaoYu20027 小时前
第1章 核心竞争力和职业规划
前端·面试·程序员