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

  1. 路由的安装:
npm install react-router-dom

在src目录下建一个router文件夹
在router文件夹里面建一个index.tsx
index.tsx内容:

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

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

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:

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里面的代码:

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。

### 使用 Vite 创建集成 React Router V7React 项目 #### 安装依赖包 为了创建一个基于 Vite 和 React Router V7 的新项目,首先需要安装必要的工具和库。可以通过命令行执行以下操作来设置环境: ```bash npm create vite@latest my-react-app --template react-ts cd my-react-app npm install react-router-dom@next ``` 这段代码片段展示了如何利用 `create-vite` 命令快速建立一个新的 Vite 项目,并指定模板为带有 TypeScript 支持的 React 应用程序[^3]。 #### 修改入口文件配置 接着,在项目的根目录下找到 `src/main.tsx` 文件,按照如下方式调整其内容以便于支持 React Router V7: ```typescript import React from 'react'; import ReactDOM from 'react-dom/client'; import App from './App'; // 导入React Router V7组件 import { BrowserRouter as Router, Route, Routes } from "react-router-dom"; const rootElement = document.getElementById("root"); if (!rootElement) throw new Error('Failed to find the root element'); const root = ReactDOM.createRoot(rootElement); root.render( <React.StrictMode> {/* 将应用程序包裹在Router内 */} <Router> <Routes> <Route path="/" element={<App />} /> </Routes> </Router> </React.StrictMode>, ); ``` 此部分代码实现了将整个应用嵌套在一个路由器实例中,从而允许页面间的导航以及动态加载不同视图的功能[^5]。 #### 配置路由规则 最后一步是在 `src/App.tsx` 中定义具体的路由映射关系。可以像下面这样编写简单的路由表结构: ```tsx import React from 'react'; import { Navigate, Outlet, } from 'react-router-dom'; function Home() { return ( <div>Home Page</div> ); } function AboutUs() { return ( <div>About Us Page</div> ); } export default function App() { return ( <> <nav> <ul> <li><a href="/">Home</a></li> <li><a href="/about">About Us</a></li> </ul> </nav> {/* 渲染匹配到的第一个子路径对应的组件 */} <Outlet /> {/* 设置默认重定向至首页 */} <Navigate replace to="/" /> </> ); } ``` 这里通过 `<Navigate>` 组件设置了当访问不存在的 URL 地址时自动跳转回主页的行为;而 `<Outlet>` 则用于显示当前激活路由所关联的具体页面内容[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枫叶&情缘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值