React Router 6 - 概述、基础路由、重定向、NavLink、路由表

一、概述

  • React Router 以三个不同的包发布到 NPM 上,它们分别为
  1. react-router:路由的核心库,提供了很多的组件、钩子

  2. react-router-dom:包含 react-router 所有内容,并添加一些专门用于 DOM 的组件,例如,<BrowserRouter>

  3. react-router-native:包括 react-router 所有内容,并添加一些专门用于 ReactNative 的 API,例如,<NativeRouter>

  • 与 React Router 5.x 版本相比,改变了什么?
  1. 内置组件的变化:移除 <Switch/>、新增 <Routes/>

  2. 语法的变化:component={About} 变为 element={<About/>}

  3. 新增多个 hook:useParamsuseNavigateuseMatch


二、基础路由

1、基本介绍
  1. 6 版本中移出了先前的 <Switch>,引入了 <Routes>

  2. <Route caseSensitive> 属性用于指定匹配时是否区分大小写,默认为 false

2、演示
(1)page
  1. About 页面
tsx 复制代码
export default function About() {
    return <h3>About Content</h3>;
}
  1. Home 页面
tsx 复制代码
export default function Home() {
    return <h3>Home Content</h3>;
}
(2)main
  1. App 组件
tsx 复制代码
import { NavLink, Routes, Route } from "react-router-dom";
import About from "./pages/About";
import Home from "./pages/Home";

export default function App() {
    return (
        <div>
            <div>
                <NavLink to="/about">About</NavLink>
                <NavLink to="/home">Home</NavLink>
            </div>
            <div>
                <Routes>
                    <Route path="/about" element={<About />} />
                    <Route path="/home" element={<Home />} />
                </Routes>
            </div>
        </div>
    );
}
  1. main.tsx
tsx 复制代码
import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import { BrowserRouter } from "react-router-dom";
import App from "./App.tsx";

createRoot(document.getElementById("root")!).render(
    <StrictMode>
        <BrowserRouter>
            <App />
        </BrowserRouter>
    </StrictMode>,
);

三、重定向

1、基本介绍
  1. 只要 <Navigate> 组件被渲染,就会修改路径,切换视图

  2. replace 属性用于控制跳转模式(push 或 replace,默认是 push)

2、演示
(1)page
  1. About 页面
tsx 复制代码
export default function About() {
    return <h3>About Content</h3>;
}
  1. Home 页面
tsx 复制代码
export default function Home() {
    return <h3>Home Content</h3>;
}
(2)main
  1. App 组件
tsx 复制代码
import { NavLink, Routes, Route, Navigate } from "react-router-dom";
import About from "./pages/About";
import Home from "./pages/Home";

export default function App() {
    return (
        <div>
            <div>
                <NavLink to="/about">About</NavLink>
                <NavLink to="/home">Home</NavLink>
            </div>
            <div>
                <Routes>
                    <Route path="/about" element={<About />} />
                    <Route path="/home" element={<Home />} />
                    <Route path="/" element={<Navigate to="/about" />} />
                </Routes>
            </div>
        </div>
    );
}
  1. main.tsx
tsx 复制代码
import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import { BrowserRouter } from "react-router-dom";
import App from "./App.tsx";

createRoot(document.getElementById("root")!).render(
    <StrictMode>
        <BrowserRouter>
            <App />
        </BrowserRouter>
    </StrictMode>,
);

1、基本介绍
  1. NavLink 用于实现"高亮"导航

  2. NavLink 默认类名是 active,也可以使用自定义类名

2、演示
(1)page
  1. About 页面
tsx 复制代码
export default function About() {
    return <h3>About Content</h3>;
}
  1. Home 页面
tsx 复制代码
export default function Home() {
    return <h3>Home Content</h3>;
}
(2)main
  1. App 组件
tsx 复制代码
import { NavLink, Routes, Route, Navigate } from "react-router-dom";
import About from "./pages/About";
import Home from "./pages/Home";
import "./App.css";

export default function App() {
    function computedClassName({ isActive }) {
        return isActive ? "my-item active" : "my-item";
    }

    return (
        <div>
            <div>
                <NavLink className={computedClassName} to="/about">
                    About
                </NavLink>
                <NavLink className={computedClassName} to="/home">
                    Home
                </NavLink>
            </div>
            <div>
                <Routes>
                    <Route path="/about" element={<About />} />
                    <Route path="/home" element={<Home />} />
                    <Route path="/" element={<Navigate to="/about" />} />
                </Routes>
            </div>
        </div>
    );
}
css 复制代码
.my-item {
    padding: 10px;
    cursor: pointer;
}

.active {
    color: red;
}
  1. main.tsx
tsx 复制代码
import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import { BrowserRouter } from "react-router-dom";
import App from "./App.tsx";

createRoot(document.getElementById("root")!).render(
    <StrictMode>
        <BrowserRouter>
            <App />
        </BrowserRouter>
    </StrictMode>,
);

五、路由表

1、基本介绍
  • useRoutes 可以根据路由表,动态创建 <Routes><Route>
2、演示
(1)page
  1. About 页面
tsx 复制代码
export default function About() {
    return <h3>About Content</h3>;
}
  1. Home 页面
tsx 复制代码
export default function Home() {
    return <h3>Home Content</h3>;
}
(2)route
  • index.tsx
tsx 复制代码
import About from "../pages/About";
import Home from "../pages/Home";
import { Navigate } from "react-router-dom";

export default [
    {
        path: "/about",
        element: <About />,
    },
    {
        path: "/home",
        element: <Home />,
    },
    {
        path: "/",
        element: <Navigate to="/about" />,
    },
];
(3)main
  1. App 组件
tsx 复制代码
import { NavLink, useRoutes } from "react-router-dom";
import routes from "./routes";
import "./App.css";

export default function App() {
    const element = useRoutes(routes);

    function computedClassName({ isActive }) {
        return isActive ? "my-item active" : "my-item";
    }

    return (
        <div>
            <div>
                <NavLink className={computedClassName} to="/about">
                    About
                </NavLink>
                <NavLink className={computedClassName} to="/home">
                    Home
                </NavLink>
            </div>
            <div>{element}</div>
        </div>
    );
}
css 复制代码
.my-item {
    padding: 10px;
    cursor: pointer;
}

.active {
    color: red;
}
  1. main.tsx
tsx 复制代码
import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import { BrowserRouter } from "react-router-dom";
import App from "./App.tsx";

createRoot(document.getElementById("root")!).render(
    <StrictMode>
        <BrowserRouter>
            <App />
        </BrowserRouter>
    </StrictMode>,
);
相关推荐
怕浪猫3 小时前
FDE 如何正确解决现场项目工程性的问题
前端·后端·ai编程
西瓜太郎12344 小时前
外层模型卡片与分组详情成功率不一致,应该怎么排查?
前端·typescript·go·软件工程·react
GreenTea4 小时前
vLLM 与 SGLang KV Cache 底层实现机制深度调研报告
前端·后端·算法
几何心凉7 小时前
没有万能模型:我用 AiiOnly Token Plan,把多款大模型的长处拼进同一个项目
前端
kyriewen7 小时前
Claude Code 的额度今天缩水了17%——官方公告上写的是"永久提高25%"
前端·ai编程·claude
雪芽蓝域zzs8 小时前
vue解构平铺VS对象包裹
前端·javascript·vue.js
风骏时光牛马8 小时前
从零到实战,完整AI学习路线
前端
三十而立洋9 小时前
深入理解 Monorepo:子包安装依赖
前端·前端工程化
IT_陈寒9 小时前
Java Stream处理大集合,我的内存怎么就炸了
前端·人工智能·后端
Captaincc9 小时前
AI 用量桌面端-桌面宠物自定义指南
前端·人工智能