React Router 深入指南:从入门到进阶

embedded/2024/12/25 0:10:51/

前言

随着单页面应用(SPA)的普及,前端路由成为开发中不可或缺的一部分,而 React Router 作为 React 官方推荐的路由库,提供了强大的功能和灵活性。本文将从基础到进阶,带你全面掌握 React Router。

一、初识 React Router

1. 安装 React Router

在项目中安装 React Router DOM:

npm install react-router-dom

2. 创建路由结构

React Router 提供多种路由创建方式,其中推荐使用 createBrowserRouter 创建基于浏览器的路由。

// src/router/index.jsx
import { createBrowserRouter } from "react-router-dom";
import Home from "../views/Home";
import Login from "../views/Login";const router = createBrowserRouter([{path: '/',element: <Home />,},{path: '/login',element: <Login />,}
]);export default router;

3. 路由挂载

使用 RouterProvider 挂载路由:

// src/App.jsx
import { RouterProvider } from "react-router-dom";
import router from "./router";
import Header from "./components/Header";
import Footer from "./components/Footer";function App() {return (<div className="app"><Header /><RouterProvider router={router} /><Footer /></div>);
}export default App;

4. 嵌套路由

在父路由组件中使用 <Outlet /> 渲染子路由:

// src/views/Home.jsx
import { Outlet } from "react-router-dom";export default function Home() {return (<div><h1>Home</h1><Outlet /></div>);
}

在路由配置中定义子路由:

// src/router/index.jsx
{path: '/home',element: <Home />,children: [{path: 'dashboard',element: <Dashboard />,},],
}

5. 配置 404 页面

为未匹配的路由配置错误页面:

// src/views/ErrorPage.jsx
export default function ErrorPage() {return <h1>Page Not Found</h1>;
}

在路由配置中使用通配符 *

{path: '*',element: <ErrorPage />,
}

二、路由跳转

1. 使用 <Link />

<Link to="/dashboard">Go to Dashboard</Link>

2. 使用 <NavLink />

<NavLink /> 会为匹配的路由自动添加 active 类名:

<NavLink to="/dashboard" activeClassName="active">Dashboard</NavLink>

自定义类名或样式:

<NavLink to="/dashboard" className={({ isActive }) => isActive ? 'custom-active' : ''}>Dashboard</NavLink>

3. 编程式跳转

使用 useNavigate

import { useNavigate } from "react-router-dom";function LoginButton() {const navigate = useNavigate();const handleLogin = () => {navigate('/home');};return <button onClick={handleLogin}>Login</button>;
}

三、传递参数

1. 使用 searchParams(Query 参数)

设置参数:

navigate('/login?user=admin&role=admin');

获取参数:

import { useSearchParams } from "react-router-dom";function Login() {const [searchParams] = useSearchParams();const user = searchParams.get('user');const role = searchParams.get('role');return <div>User: {user}, Role: {role}</div>;
}

2. 使用 params(路径参数)

设置路径参数:

{path: '/profile/:id',element: <Profile />,
}

获取参数:

import { useParams } from "react-router-dom";function Profile() {const { id } = useParams();return <div>Profile ID: {id}</div>;
}

四、进阶功能

1. 数据预加载(Loader)

在路由配置中使用 loader

{path: '/data',element: <DataPage />,loader: async () => {const response = await fetch('/api/data');return response.json();},
}

在组件中使用 useLoaderData

import { useLoaderData } from "react-router-dom";function DataPage() {const data = useLoaderData();return <div>{JSON.stringify(data)}</div>;
}

2. 懒加载(Lazy Loading)

使用 React.lazySuspense 实现组件的按需加载:

import React, { lazy, Suspense } from "react";const LazyComponent = lazy(() => import("../views/LazyComponent"));{path: '/lazy',element: (<Suspense fallback={<div>Loading...</div>}><LazyComponent /></Suspense>),
}

五、总结

通过本文,我们系统地梳理了 React Router 的基本用法和进阶功能。无论是创建路由、路由跳转还是参数传递,React Router 都提供了丰富且易用的 API。在实际项目中,合理配置路由和组件加载策略,可以显著提升应用的性能与用户体验。


http://www.ppmy.cn/embedded/148473.html

相关文章

sqlite3,一个轻量级的 C++ 数据库库!

宝子们&#xff0c;今天咱来唠唠 sqlite3 这个超棒的轻量级 C 数据库库。它就像是一个小巧但功能齐全的“数据仓库”&#xff0c;能帮咱们轻松地存储、查询和管理数据&#xff0c;无论是开发小型的桌面应用&#xff0c;还是做一些简单的数据处理程序&#xff0c;它都能派上大用…

前端开发 之 12个鼠标交互特效上【附完整源码】

前端开发 之 12个鼠标交互特效上【附完整源码】 文章目录 前端开发 之 12个鼠标交互特效上【附完整源码】一&#xff1a;彩色空心爱心滑动特效1.效果展示2.HTML完整代码 二&#xff1a;彩色实心爱心滑动特效1.效果展示2.HTML完整代码 三&#xff1a;粒子连结特效1.效果展示2.HT…

大模型与呼叫中心结合的呼入机器人系统

大模型与呼叫中心结合的呼入机器人系统 原作者&#xff1a;开源呼叫中心FreeIPCC&#xff0c;其Github&#xff1a;https://github.com/lihaiya/freeipcc 随着人工智能技术的发展&#xff0c;特别是大模型&#xff08;large language models, LLMs&#xff09;的进步&#xf…

介绍 Html 和 Html 5 的关系与区别

HTML&#xff08;HyperText Markup Language&#xff09;是构建网页的标准标记语言&#xff0c;而 HTML5 是 HTML 的最新版本&#xff0c;包含了一些新的功能、元素、API 和属性。HTML5 相对于早期版本的 HTML&#xff08;比如 HTML4&#xff09;有许多重要的改进和变化。以下是…

【CSS in Depth 2 精译_085】14.2:CSS 蒙版的用法

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第四部分 视觉增强技术 ✔️【第 14 章 蒙版、形状与剪切】 ✔️ 14.1 滤镜 14.1.1 滤镜的类型14.1.2 背景滤镜 14.2 蒙版 ✔️ 14.2.1 带渐变效果的蒙版特效 ✔️14.2.2 基于亮度来定义蒙版 ✔️14…

将HTML转换为PDF:使用Spire.Doc的详细指南(一) 试用版

目录 引言 1. 为什么选择 Spire.Doc&#xff1f; 1.1 主要特点 1.2 适用场景 2. 准备工作 2.1 引入 Spire.Doc 依赖 2.2 禁用 SSL 证书验证 3. 实现功能 3.1 主类结构 3.2 代码解析 4. 处理图像 5. 性能优化 5.1 异步下载图像 示例代码 5.2 批量处理优化 示例代…

探索:为什么数组数据后端确要求前端传递,拼接的字符呢

你们好&#xff0c;我是金金金。 前言 撰写本文是因为好奇&#xff0c;好奇为什么,拼接的字符串数据过去能直接变成数组&#xff0c;好奇为什么让传,拼接的字符串而不是直接传递数组数据&#xff0c;好奇… 探索 首先看get请求&#xff0c;get请求参数一般都是携带在路径后面的…

汽车IVI中控开发入门及进阶(44):杰发科智能座舱芯片

概述: 杰发科技自成立以来,一直专注于汽车电子芯片及相关系统的研发与设计。 产品布局: 合作伙伴: 杰发科技不断提升产品设计能力和产品工艺,确保产品达 到更高的质量标准。目前杰发科技已通过ISO9001质 量管理体系与CMMIL3认证。 杰发科技长期合作的供应商(芯片代工厂、…