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。

相关推荐
伟笑2 分钟前
elementUI 表格隔行换色,修改table表头背景样式
前端·javascript·elementui
m0_748234528 分钟前
SpringMVC 请求参数接收
前端·javascript·算法
@PHARAOH9 分钟前
HOW - 在Windows浏览器中模拟MacOS的滚动条
前端·macos
叫我OldFe20 分钟前
vue videojs使用canvas截取视频画面
前端·vue.js·音视频·js
七爷不在我这里30 分钟前
charles 抓取https<仅web端>
前端·网络协议·https·charles
CsharpDev-奶豆哥36 分钟前
ASP.NET实现上传图片生成缩略图的功能
服务器·前端·asp.net
timer_01737 分钟前
Skyeye 云智能制造办公系统 VUE 版本 v3.15.11 发布
前端·vue.js·制造
大麦大麦1 小时前
2025前端最新面试题-安全篇
开发语言·前端·javascript·安全·面试·ecmascript
刺客-Andy1 小时前
React 之 Redux 第二十八节 学习目标与规划大纲及概要讲述
前端·react.js·前端框架
刺客-Andy1 小时前
React 各模块相关全面面试及答案解析
前端·react.js·面试