如何使用react-router v6快速搭建路由?

本文介绍了ReactRouter6的重大升级,包括组件结构变化(如使用<Routes>替换<Switch>),新的导航链接和导航管理方法,路由参数处理,嵌套路由以及导航组件的更新。作者通过实例演示了如何在新版本中正确配置和使用这些功能。

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

前言

之前一直使用react-router V5,上次搭建一个小项目,下载的react-router V6, 本以为没什么区别,就按照v5的那一套用了,区区小功能,奈何不了我的。然后自信满满的运行,哦豁,不生效,点击也没反应,不应该呀,然后就网上查了一下,确实不一样了,改动还不少呢,顺便去瞄了一眼官方文档,折腾一番,完美解决。

V6 & V5

React Router 6 是 React Router 库的一个重大升级,它引入了一些重要的变化和新功能,以提供更好的路由管理体验。以下是 React Router 6 的一些主要改进和变化,以及相应的代码示例和用法:

  1. 组件结构变化:
    React Router 6 引入了新的组件结构。原来的<Switch> 组件被移除,取而代之的是一个新的 <Routes> 组件,它用于定义路由层次结构。

    import { Routes, Route } from 'react-router-dom';
    
    function App() {
      return (
        <Routes>
          <Route path="/" element={<Home />} />
          <Route path="/about" element={<About />} />
        </Routes>
      );
    }
    
  2. 导航链接:
    React Router 6 引入了 <Link> 组件,用于创建导航链接。 v6 中消除了这种歧义模糊的写法,在下,无论当前 url 是否拥有后斜杠,将始终被渲染为<a href="/users/me" />

    import { Link } from 'react-router-dom';
    
    function Navigation() {
      return (
        <nav>
          <Link to="/">Home</Link>
          <Link to="/about">About</Link>
        </nav>
      );
    }
    

3.useNavigate
useNavigate 代替了之前的useHistory。useNavigate 钩子返回了一个函数 navigate,当用户点击按钮时,它会调用 navigate('/new-path') 来导航到指定的路由。这允许您以编程方式控制用户在应用程序中的导航,而无需依赖导航链接或其他用户界面元素。

import { useNavigate } from 'react-router-dom';

function MyComponent() {
  const navigate = useNavigate();

  const handleNavigation = () => {
    navigate('/new-path');
  };

  return (
    <div>
      <button onClick={handleNavigation}>Go to New Path</button>
    </div>
  );
}
  1. 重定向
    Navigate代替Redirect组件,实现重定向。<Navigate> 组件是用于在组件内部进行编程式导航的,不应该用于定义路由规则或路由重定向。路由的定义应该在 <Route> 组件中完成。
import { Route } from 'react-router-dom';

function MyComponent() {
  // 在需要的地方执行重定向逻辑
  // 例如,可以根据某些条件进行重定向
  const shouldRedirect = true;
  return (
    <Route
      path="/"
      element={
        shouldRedirect
          ? <Navigate to="/new-path" replace />
          : <YourComponent />
      }
    />
  );
}

  1. 路由参数:
    React Router 6 采用了新的方式来处理路由参数。参数现在是在路由路径中使用冒号进行定义,然后可以在组件中通过 useParams 钩子来访问。

    // 路由定义
    <Route path="/user/:id" element={<User />} />
    
    // 在组件中获取参数
    import { useParams } from 'react-router-dom';
    
    function User() {
      const { id } = useParams();
      // 使用 id
    }
    
  2. 嵌套路由:
    React Router 6 支持更灵活的嵌套路由。您可以在路由配置中使用 <Routes> 组件来定义嵌套路由。

    function App() {
      return (
        <Routes>
          <Route path="/" element={<Home />} />
          <Route path="/user/:id" element={<User />}>
            <Route index element={<UserProfile />} />
            <Route path="posts" element={<UserPosts />} />
          </Route>
        </Routes>
      );
    }
    

使用示例

入口文件index.tsx如下

const root = ReactDOM.createRoot(
  document.getElementById("root") as HTMLElement
);
root.render(
    <App />
);

App组件:

import React from "react";
import { Routes, Route, Navigate, BrowserRouter } from "react-router-dom";
import * as hhh from 'react-router-dom'
import Hmoe from "@/pages/index";
import Login from "@/pages/index";
export default function routers() {
  console.log("gfb", hhh);
  
  return (
    <div style={{height:'100%'}}>
      <BrowserRouter>
        <Routes>
        // 注意这里的/*  不加上,Home组件下路由无法匹配
          <Route path="/home/*" element={<Hmoe />}></Route>
          <Route path="/login" element={<Login />}></Route>
          // 重定向的写法
          <Route path="/" element={<Navigate to="/home" />}></Route>
        </Routes>
      </BrowserRouter>
    </div>
  );
}

Home组件

import React from "react";
import { Routes, Route, Link } from "react-router-dom";

import EditorTable from "./DropTree/EditorTable";
import UploadCom from "@/components/Upload";
import Todolist from "@/pages/MyUseContext/TodoList";
import Routers from "@/pages/Routers/index";

import "./style.less";

const AppIndex = () => {
  return (
    <div className="pageRoot">
      <div className="left-demo">
        <div style={{ height: 32 }}>
          <Link to="/home/upload">上传文件</Link>
        </div>
        <div style={{ height: 32 }}>
          <Link to="/home/todolist">todolist</Link>
        </div>
        <div style={{ height: 32 }}>
          <Link to="/home/editorTable">可编辑Table</Link>
        </div>
        <div style={{ height: 32 }}>
          <Link to="/home/testRoute">Prompt</Link>
        </div>
      </div>
      <div className="right-bigData">
        <Routes>
        // 这里就省略了/home 
          <Route path="/upload" element={<UploadCom />} />
          <Route path="/todolist" element={<Todolist />} />
          <Route path="/editorTable" element={<EditorTable />} />
          <Route path="/testRoute" element={<Routers />} />
        </Routes>
      </div>
    </div>
  );
};
export default AppIndex;

例子就是这个样子的,这里没调样式
在这里插入图片描述

React Router是一个用于建立SPA应用程序的库,它提供了一种将应用程序状态与URL同步的方式。React Router v6React Router的最新版本,它引入了一些新的概念和语法。 下面是使用React Router v6搭建路由的步骤: 1. 安装React Router v6 使用npm或者yarn安装React Router v6: ``` npm install react-router-dom@next ``` 2. 创建路由 在应用程序的入口文件中,使用BrowserRouter创建一个路由: ```jsx import { BrowserRouter } from 'react-router-dom'; ReactDOM.render( <BrowserRouter> <App /> </BrowserRouter>, document.getElementById('root') ); ``` 3. 定义路由 使用Route组件定义路由。Route组件的path属性指定URL的路径,component属性指定该路径对应的组件: ```jsx import { Route } from 'react-router-dom'; function App() { return ( <div> <Route path="/" component={Home} /> <Route path="/about" component={About} /> </div> ); } ``` 在上面的例子中,当URL路径为“/”时,渲染Home组件;当URL路径为“/about”时,渲染About组件。 4. 处理404页面 使用Route组件的exact属性确保路由匹配完全相等的路径。这样可以避免在匹配“/”路径时同时匹配到所有其他路径。 使用Route组件的path属性指定“*”路径,即匹配所有路径的路径。将这个Route组件放在所有其他Route组件的下面,就可以为未匹配到任何路径的URL显示404页面: ```jsx import { Route, Routes } from 'react-router-dom'; function App() { return ( <div> <Routes> <Route path="/" element={<Home />} /> <Route path="/about" element={<About />} /> <Route path="*" element={<NotFound />} /> </Routes> </div> ); } ``` 在上面的例子中,当URL路径为任何未匹配到的路径时,渲染NotFound组件。 5. 嵌套路由 使用Routes组件嵌套Route组件,可以创建嵌套路由。在嵌套路由中,父级Route组件的path属性包含所有子级Route组件的path属性的前缀。 ```jsx import { Route, Routes } from 'react-router-dom'; function App() { return ( <div> <Routes> <Route path="/" element={<Home />} /> <Route path="/about" element={<About />}> <Route path="team" element={<Team />} /> <Route path="history" element={<History />} /> </Route> <Route path="*" element={<NotFound />} /> </Routes> </div> ); } ``` 在上面的例子中,当URL路径为“/about/team”时,渲染Team组件;当URL路径为“/about/history”时,渲染History组件。 React Router v6引入了一些新的语法,例如使用Routes组件代替Router组件,使用element属性代替component属性等。这些语法的目的是让React Router更加简洁易用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值