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:useParams、useNavigate、useMatch 等


二、基础路由

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>,
);
相关推荐
福兮说8 小时前
设计稿是 #4A7C6F,页面量出来是 #4B7C6F:HEX、HSL、透明度、canvas 来回转的七个坑
前端·javascript·css·canvas
郑州光合科技余经理9 小时前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
小呆呆66610 小时前
副业搞起来,小说,漫画,漫剧的成本优化思路
前端·后端·面试
凤城老人10 小时前
从 PyQt6 到 Electron:给 Edge TTS 做一个“多角色配音机“的踩坑手记
javascript·typescript·electron
Dovis(誓平步青云)10 小时前
浇水提醒刚弹出又消失,植物状态别只存一个百分比
开发语言·前端·javascript·pdf·ecmascript·电脑
码艺-Alimjan11 小时前
Vben Admin 新增维吾尔语 Vben-Modal的关键坑之一
前端·javascript·vue.js
可乐鸡翅yeah_11 小时前
hls.js 手动自定义 http 请求 loader,修改请求头实战
开发语言·前端·javascript·网络协议·http·ecmascript·m3u8在线
IT_陈寒11 小时前
Vite静态资源导入这个坑我帮你们踩过了
前端·人工智能·后端
广州华水科技12 小时前
大坝安全监测解决方案:单北斗GNSS形变监测系统应用与维护
前端
yivifu12 小时前
中文古籍电子书注释集成
前端·javascript·python·beautifulsoup·epub