详细讲一下React中的路由React Router

1. 基本概念

React Router 是 React 的路由管理库,用于在 React 应用中实现页面导航和路由控制。

2. 安装

npm install react-router-dom

3. 基础用法

// App.jsx
import { BrowserRouter, Routes, Route, Link } from 'react-router-dom'function App() {return (<BrowserRouter>{/* 导航链接 */}<nav><Link to="/">首页</Link><Link to="/about">关于</Link><Link to="/user">用户</Link></nav>{/* 路由配置 */}<Routes><Route path="/" element={<Home />} /><Route path="/about" element={<About />} /><Route path="/user" element={<User />} /></Routes></BrowserRouter>)
}

4. 路由类型

1. BrowserRouter:使用 HTML5 history API

<BrowserRouter>{/* 你的应用 */}
</BrowserRouter>

2.HashRouter:使用 URL 的 hash 部分

<HashRouter>{/* 你的应用 */}
</HashRouter>

5. 路由导航

1.声明式导航(Link组件):

<Link to="/about">关于我们</Link>
<Link to="/user/123">用户详情</Link>

2.编程式导航(useNavigate钩子) :

import { useNavigate } from 'react-router-dom'function LoginButton() {const navigate = useNavigate()const handleLogin = () => {// 登录成功后跳转navigate('/dashboard')// 带参数跳转navigate('/user', { state: { id: 123 } })// 返回上一页navigate(-1)}return <button onClick={handleLogin}>登录</button>
}

6. 路由参数

1. URL参数:

// 路由配置
<Route path="/user/:id" element={<UserDetail />} />// 组件中获取参数
import { useParams } from 'react-router-dom'function UserDetail() {const { id } = useParams()return <div>用户ID:{id}</div>
}

2. 查询参数:

// 使用查询参数
<Link to="/search?keyword=react">搜索</Link>// 获取查询参数
import { useSearchParams } from 'react-router-dom'function Search() {const [searchParams] = useSearchParams()const keyword = searchParams.get('keyword')return <div>搜索关键词:{keyword}</div>
}

7. 嵌套路由

function App() {return (<Routes><Route path="/" element={<Layout />}><Route index element={<Home />} /><Route path="about" element={<About />} /><Route path="users" element={<Users />}><Route path=":id" element={<UserDetail />} /></Route></Route></Routes>)
}// Layout组件
function Layout() {return (<div><nav>{/* 导航栏 */}</nav><Outlet /> {/* 子路由渲染位置 */}</div>)
}

8. 路由守卫(保护路由)

function PrivateRoute({ children }) {const isAuthenticated = checkAuth() // 检查用户是否登录if (!isAuthenticated) {return <Navigate to="/login" replace />}return children
}// 使用
<Route path="/dashboard" element={<PrivateRoute><Dashboard /></PrivateRoute>} 
/>

9. 路由钩子

// 1. useLocation - 获取当前路由信息
function Component() {const location = useLocation()console.log(location.pathname) // 当前路径console.log(location.search)   // 查询参数console.log(location.state)    // 路由状态
}// 2. useNavigate - 编程式导航
function Component() {const navigate = useNavigate()navigate('/path')
}// 3. useParams - 获取URL参数
function Component() {const { id } = useParams()
}// 4. useSearchParams - 获取查询参数
function Component() {const [searchParams, setSearchParams] = useSearchParams()
}

10. 实际应用示例

// 完整的路由配置示例
import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom'function App() {return (<BrowserRouter><Routes>{/* 公共路由 */}<Route path="/" element={<Layout />}><Route index element={<Home />} /><Route path="about" element={<About />} /><Route path="products" element={<Products />}><Route path=":id" element={<ProductDetail />} /></Route>{/* 需要认证的路由 */}<Route path="dashboard" element={<PrivateRoute><Dashboard /></PrivateRoute>}><Route path="profile" element={<Profile />} /><Route path="settings" element={<Settings />} /></Route>{/* 404页面 */}<Route path="*" element={<NotFound />} />{/* 重定向 */}<Route path="old-path" element={<Navigate to="/new-path" replace />} /></Route></Routes></BrowserRouter>)
}

11. 最佳实践

1.路由配置集中管理:

// routes.js
const routes = [{path: '/',element: <Layout />,children: [{ index: true, element: <Home /> },{ path: 'about', element: <About /> },{ path: 'users', element: <Users /> }]}
]// App.jsx
import { useRoutes } from 'react-router-dom'function App() {const element = useRoutes(routes)return element
}

2.懒加载路由:

import { lazy, Suspense } from 'react'const Dashboard = lazy(() => import('./pages/Dashboard'))function App() {return (<Routes><Route path="/dashboard" element={<Suspense fallback={<Loading />}><Dashboard /></Suspense>} /></Routes>)
}

这些内容涵盖了 React Router 的主要使用方法。记住:

  • 总是在应用最外层包裹 BrowserRouter
  • 使用 Routes 和 Route 定义路由规则
  • 使用 Link 或 useNavigate 进行导航
  • 合理使用路由钩子获取和操作路由信息
  • 需要时使用路由守卫保护私有路由
  • 考虑使用懒加载优化性能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/64554.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人工智能的视觉天赋:一文读懂卷积神经网络

什么是CNN&#xff1f; CNN&#xff0c;全称为卷积神经网络&#xff08;Convolutional Neural Network&#xff09;&#xff0c;是一种模拟人类视觉感知机制的人工神经网络。它通过层叠的卷积、池化等操作&#xff0c;从数据中提取关键特征&#xff0c;进而完成分类、识别或预…

【OpenGL ES】GLSL基础语法

1 前言 本文将介绍 GLSL 中数据类型、数组、结构体、宏、运算符、向量运算、矩阵运算、函数、流程控制、精度限定符、变量限定符&#xff08;in、out、inout&#xff09;、函数参数限定符等内容&#xff0c;另外提供了一个 include 工具&#xff0c;方便多文件管理 glsl 代码&a…

使用 ECharts 与 Vue 构建数据可视化组件

在前端开发中&#xff0c;数据可视化是非常重要的一部分。ECharts 作为一个功能强大且易于使用的开源数据可视化库&#xff0c;被广泛应用于各种图表展示需求中。而 Vue.js 是当下流行的前端框架之一&#xff0c;它的数据驱动和组件化开发模式让我们能轻松地将 ECharts 集成到 …

RPA系列-uipath 学习笔记4

使用Uipath 处理hover的问题 备注&#xff1a;使用uipath stversion&#xff1a;2024.10.6,所有学习来源自uipath Academy 首先&#xff0c;打开uipath给我们提供的一个网站 ACME,这个网站呢&#xff0c;需要提前注册一下的哈。 今天呢&#xff0c;就是记录一下&#xff0c;怎…

Linux:进程概念

1.冯诺依曼体系结构 结论&#xff1a; --- CPU不和外设直接打交道&#xff0c;和内存直接打交道。 --- 所有的外设&#xff0c;有数据需要收入&#xff0c;只能载入到内存中&#xff1b;内存写出&#xff0c;也一定是写道外设中。 --- 为什么程序要运行必须加载到内存&#xf…

活动预告 | Microsoft Azure 在线技术公开课:使用 Azure OpenAI 服务构建生成式应用

课程介绍 通过 Microsoft Learn 免费参加 Microsoft Azure 在线技术公开课&#xff0c;掌握创造新机遇所需的技能&#xff0c;加快对 Microsoft Cloud 技术的了解。参加我们举办的“使用 Azure OpenAI 服务构建生成式应用”活动&#xff0c;了解如何使用包括 GPT 在内的强大的…

Linux(Centos 7.6)常见基础配置

1.网络配置 网络配置详见&#xff1a;VMware安装Linux(Centos 7.6)后网络配置 2.yum源配置 yum源配置详见&#xff1a;Linux(Centos 7.6)yum源配置 3.主机名配置 1.Linux(Centos 7.6)系统安装后&#xff0c;没有配置主机名时&#xff0c;root用户登录后&#xff0c;是如下…

【PyCharm】如何把本地整个项目同步到服务器?

在PyCharm中&#xff0c;您可以使用部署功能将项目同步到服务器。以下是步骤和示例配置&#xff1a; 打开PyCharm&#xff0c;选择您的项目。 点击菜单栏的 “File” -> “Settings” -> “Build, Execution, Deployment”。 在左侧菜单中&#xff0c;选择 “Deployme…

电子电器架构 ---什么是智能电动汽车上的逆变器?

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的…

Flutter:打包apk,详细图文介绍

困扰了一天&#xff0c;终于能正常打包apk安装了&#xff0c;记录下打包的流程。建议参考我这篇文章时&#xff0c;同时看下官网的构建说明。 官网构建并发布 Android 应用详情 1、AS创建Flutter项目 2、cmd执行命令 生成一个sunluyi.jks的文件&#xff0c;可以自行把sunluyi替…

【服务器学习专栏 1.2 -- 带外管理】

请阅读 嵌入式学习必备专栏 文章目录 Overview服务器带外管理BMC 介绍BMC 特点BMC 工作原理 Overview 从技术的角度&#xff0c;网络管理可分为带外管理&#xff08;out-of-band&#xff09;和带内管理&#xff08;in-band&#xff09;两种管理模式。 带内管理&#xff0c;是指…

南京市建邺区南苑街道一行莅临园区考察交流

2024年8月28日&#xff0c;南京市建邺区南苑街道办事处副主任董兵、南苑街道发展服务办公室一级主任科员王洪政、建邺区国资集团科创公司经理杲畅&#xff0c;在树莓集团华东区负责人田林和陈强经理的陪同下&#xff0c;莅临集团总部-国际数字影像产业园考察交流。 树莓科技&am…

docker中使用nginx

宿主机和docker中nginx做映射 宿主机中nginx 映射目录 /root/myDockerData/devnginx 在容器中相关位置分别是&#xff1a; 配置文件位置&#xff1a;/etc/nginx/ 日志位置&#xff1a;/var/log/nginx/ 项目位置&#xff1a;/usr/share/nginx/html 如下配置启动命令行&#x…

【ES6复习笔记】对象方法扩展(17)

对象方法扩展 在 JavaScript 中&#xff0c;对象是属性和方法的集合。除了内置的方法&#xff0c;我们还可以通过扩展对象的原型来添加新的方法。本教程将介绍如何使用 Object.is、Object.assign 和 Object.setPrototypeOf 方法来扩展对象。 1. Object.is 判断两个值是否完全…

基于JDK 17 编写的Java常用工具类

文章目录 DateUtilsEncryptUtilsFunIdCardCalibrationUtilResultResultCodeValidateNameUtilValidatePhoneUtil 废话少说看源码 DateUtils package com.huihang.core.utils;import java.time.Duration; import java.time.LocalDate; import java.time.LocalDateTime; import j…

Casino Royale靶场wp

0x00 下载安装 https://download.vulnhub.com/casinoroyale/CasinoRoyale.ova 导入vmware启动 0x01 主机信息收集 0x02目录扫描 index.php 获取到一个域名 修改本地hosts 添加一行 路径&#xff1a;C:\Windows\System32\drivers\etc 192.168.2.20 casino-royale.local 点击…

智能家居体验大变革 博联 AI 方案让智能不再繁琐

1. 全球AI技术发展背景及智能家居市场趋势 人工智能&#xff08;AI&#xff09;技术的飞速发展正在推动全球各行业的数字化转型。国际电信联盟与德勤联合发布《人工智能向善影响》报告指出&#xff0c;全球94%的商界领袖认为&#xff0c;人工智能技术对于其企业在未来5年内的发…

鸿蒙开发(27)案例今日任务

案例为纯前端实现&#xff0c;总结案例。 主页面代码 import { TaskStatisties } from ../view/TaskStatisties import { TaskItem } from ../view/TaskItem import CreateTaskModel, {TaskModel} from ../viewmodel/TaskModel import { router } from kit.ArkUI// xxx.ets En…

WPF编程excel表格操作

WPF编程excel表格操作 摘要NPOI安装封装代码测试代码 摘要 Excel操作几种方式 使用开源库NPOI(常用&#xff0c;操作丰富)使用Microsoft.Office.Interop.Excel COM组件(兼容性问题)使用OpenXml(效率高)使用OleDb(过时) NPOI安装 封装代码 using System; using System.IO; u…

tcp_rcv_synsent_state_process函数

tcp_rcv_synsent_state_process 是 Linux Kernel 中用于处理 TCP 连接在 SYN-SENT 状态下接收到报文的函数。这个函数在 TCP 三次握手阶段起到了至关重要的作用,处理了在客户端发送 SYN 请求之后收到服务器响应报文的各种情况。 以下是这个函数的解读和剖析: int tcp_rcv_sy…