react 路由配置:从入门到精通

前言

在现代Web开发中,React凭借其高效的组件化开发模式和虚拟DOM技术,已成为构建用户界面的首选库之一。然而,仅掌握React的核心概念并不足以应对复杂的单页应用(SPA)开发需求。路由管理作为连接各个页面、实现视图切换的关键环节,对于提供流畅的用户体验至关重要。无论是导航到不同的页面,还是根据URL动态展示内容,合理设计与实现路由都是每个React开发者必须面对的课题。

本文旨在为读者提供一个全面而深入的指南,帮助你从基础到高级全面掌握React路由的应用。无论你是刚刚接触React的新手,还是希望进一步提升技能的有经验开发者,“React 路由:一篇就够了”都将为你揭开React路由管理的神秘面纱。我们将从最基础的路由配置开始,逐步深入探讨如何利用react-router-dom库进行页面导航、参数传递、嵌套路由设置,乃至基于权限控制的私有路由实现等高级话题。此外,我们还将介绍懒加载等优化策略,以提高应用性能。通过阅读这篇文章,你将能够自信地在自己的项目中实现高效且灵活的路由系统,让开发过程更加得心应手。让我们一起开启这段探索React路由之旅吧!

安装 react-router-dom 

yarn add react-router-dom
或者

npm install react-router-dom

路由引入

 在App.tsx里引入

import './App.css'
import AppRoutes from './routes/RouterConfig'const App: React.FC = () => {return (<div className="App"><AppRoutes /></div>)
}export default App

路由配置

下面的是路由的配置, 这里使用的是基于history模式的BrowserRouter,当然也可以使用HashRouter包裹(哈希路由),这里还设置了如果进入没有配置的路由页面,则会显示404页面。

这里也配置了二级路由,同时也加了路由守卫

import { FC } from 'react'
import { BrowserRouter, Route, Routes, Outlet } from 'react-router-dom'
import Login from '@/pages/LoginPage'
import Home from '@/pages/Home'
import About from '@/pages/About'
import NotFoundPage from '@/pages/NotFoundPage'
import PrivateRoute from './PrivateRoute'export const routes = [{ path: '/login', element: <Login />, isPrivate: false },{ path: '/', element: <Home />, isPrivate: true, children: [{ path: 'about', element: <About />, isPrivate: true }] },{ path: '*', element: <NotFoundPage />, isPrivate: false },
]const AppRoutes: FC = () => {// 递归渲染路由const renderRoutes = (routes: any) => {return routes.map((route: any) => {let element = route.isPrivate ? <PrivateRoute>{route.element}</PrivateRoute> : route.elementif (route.children) {element = (<>{element}<Outlet /></>)}return (<Route key={route.path} path={route.path} element={element}>{route.children && renderRoutes(route.children)}</Route>)})}return (<BrowserRouter><Routes>{renderRoutes(routes)}</Routes></BrowserRouter>)
}export default AppRoutes

路由守卫 

React的路由守卫(Route Guards)是一种用于控制页面访问的机制。它允许你在用户尝试访问某个页面之前,执行一些逻辑,如验证用户身份、检查页面权限等。

import { Navigate } from 'react-router-dom'
import { useSelector } from 'react-redux'
import { RootState } from '@/store/index'interface PrivateRouteProps {children: JSX.Element
}// 定义一个私有路由组件
const PrivateRoute: React.FC<PrivateRouteProps> = ({ children }) => {// 从Redux中获取用户是否登录的状态const isLoggedIn = useSelector((state: RootState) => state.authReducer.isLoggedIn)// 如果用户已登录,则渲染子组件,否则重定向到登录页面return isLoggedIn ? children : <Navigate to="/login" />
}export default PrivateRoute

路由懒加载

使用懒加载lazy和当网络异常时的回调组件方式Suspense 

下面是完整的路由配置代码

import { FC, lazy, Suspense } from 'react'
import { BrowserRouter, Route, Routes, Outlet } from 'react-router-dom'
import PrivateRoute from './PrivateRoute'// 使用 lazy 函数进行懒加载
const Login = lazy(() => import('@/pages/LoginPage'))
const Home = lazy(() => import('@/pages/Home'))
const About = lazy(() => import('@/pages/About'))
const NotFoundPage = lazy(() => import('@/pages/NotFoundPage'))export const routes = [{ path: '/login', element: <Login />, isPrivate: false },{ path: '/', element: <Home />, isPrivate: true, children: [{ path: 'about', element: <About />, isPrivate: true }] },{ path: '*', element: <NotFoundPage />, isPrivate: false },
]const AppRoutes: FC = () => {const renderRoutes = (routes: any) => {return routes.map((route: any) => {let element = route.isPrivate ? <PrivateRoute>{route.element}</PrivateRoute> : route.elementif (route.children) {element = (<>{element}<Outlet /></>)}return (<Route key={route.path} path={route.path} element={<Suspense fallback={<div>加载中……</div>}>{element}</Suspense>}>{route.children && renderRoutes(route.children)}</Route>)})}return (<BrowserRouter><Suspense fallback={<div>Loading...</div>}><Routes>{renderRoutes(routes)}</Routes></Suspense></BrowserRouter>)
}export default AppRoutes

react-router-dom 基本原理

在React应用中,路由跳转的原理主要依赖于react-router-dom库所提供的机制。该库基于HTML5 History API(包括pushStatereplaceState等方法)和哈希(hash)模式来管理URL的变化,并通过监听URL变化来动态加载不同的组件,从而实现页面的无刷新切换。以下是React路由跳转的基本原理及其工作流程:

基本原理
  1. History API: react-router-dom使用了HTML5的History API来操作浏览器的历史记录栈。这意味着它可以添加或修改历史记录条目,使得用户可以通过前进或后退按钮导航,而不会触发整个页面的重新加载。具体来说,当进行路由跳转时,它会调用history.push()history.replace()等方法来改变当前的URL路径。

  2. 监听URL变化: 当用户执行某些动作(如点击链接或浏览器的前进/后退按钮)导致URL发生变化时,react-router-dom会监听到这些变化。这通常通过window对象上的popstate事件来实现。一旦检测到URL变化,它就会根据新的URL路径来决定应该渲染哪个组件。

  3. 匹配路由与渲染组件: 根据配置好的路由表,react-router-dom会尝试将当前的URL路径与定义的路由进行匹配。如果找到匹配项,则会渲染相应的React组件;如果没有匹配项,则可能会显示404页面或其他默认内容

工作流程
  • 初始化: 在应用启动时,react-router-dom会首先读取配置好的路由表,并根据初始URL渲染对应的组件。

  • 导航跳转: 当需要从一个页面跳转到另一个页面时,可以使用<Link>组件或者编程方式(如useNavigate钩子)来发起跳转。这会导致URL发生变化,但不会重新加载整个页面。

  • 响应URL变化: URL更新后,react-router-dom会监听到这一变化,并查找与新URL相匹配的路由规则。如果找到了匹配项,就渲染对应的组件;否则,可能展示一个错误页面。

  • 状态管理: 除了基本的路由跳转外,react-router-dom还允许你在跳转过程中传递状态信息,比如通过查询参数或者路由状态等。

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

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

相关文章

CPLD实现SPI通信

在 CPLD 中编写 SPI 程序时,需根据具体需求(主/从设备、时钟极性、数据位宽等)设计逻辑。以下提供一个 SPI 主控制器的 Verilog 实现示例,支持 模式 0(CPOL=0, CPHA=0),适用于控制外设(如 ADC、DAC、存储器等)。 SPI 主控制器模块设计(Verilog) 模块功能 支持 8/16…

MapReduce简单应用(三)——高级WordCount

目录 1. 高级WordCount1.1 IntWritable降序排列1.2 输入输出格式1.3 处理流程 2. 代码和结果2.1 pom.xml中依赖配置2.2 工具类util2.3 高级WordCount2.4 结果 参考 本文引用的Apache Hadoop源代码基于Apache许可证 2.0&#xff0c;详情请参阅 Apache许可证2.0。 1. 高级WordCo…

智慧机房解决方案(文末联系,领取整套资料,可做论文)

智慧机房解决方案-软件部分 一、方案概述 本智慧机房解决方案旨在通过硬件设备与软件系统的深度整合&#xff0c;实现机房的智能化管理与服务&#xff0c;提升机房管理人员的工作效率&#xff0c;优化机房运营效率&#xff0c;确保机房设备的安全稳定运行。软件部分包括机房管…

(五)Spring Boot学习——spring security +jwt使用(前后端分离模式)

一定要熟悉spring security原理和jwt无状态原理&#xff0c;理解了才知道代码作用。 在 Spring Security JWT 认证流程中&#xff0c;通常的做法是&#xff1a; 用户提交用户名和密码Spring Security 认证管理器 (AuthenticationManager) 进行认证如果认证成功&#xff0c;生…

清华DeepSeek手册:从入门到精通(网页版便于阅读)

目录 一、产品概述二、清华DeepSeek从入门到精通三、PDF文件路径 一、产品概述 DeepSeek是国产领先的人工智能技术平台&#xff0c;提供从数据分析到大型语言模型的全栈解决方案。其核心产品包括网页端数据分析工具[1] 、视觉语言模型(DeepSeek-VL)[2] 和670亿参数大型语言模型…

阿里云百炼初探DeepSeek模型调用

阿里云百炼初探DeepSeek模型调用 阿里云百炼为什么选择百炼开始使用百炼方式一&#xff1a;文本对话方式二&#xff1a;文本调试方式三&#xff1a;API调用 DeepSeek调用1、搜索模型2、查看API调用3、开始调用安装依赖查看API Key运行以下代码 4、流式输出 总结 阿里云百炼 阿…

【网络安全】服务器安装Docker及拉取镜像教程

文章目录 1. 安装 Docker2. 拉取镜像3. 运行 Ubuntu 容器4. 执行相关操作5. 退出并停止容器1. 安装 Docker # 更新软件包索引 sudo apt update# 安装必要的依赖 sudo apt install -y ca-certificates curl gnupg

AI刷题-子数组和的最大值问题

目录 问题描述 输入格式 输出格式 输入样例 输出样例 说明 数据范围 解题思路&#xff1a; 问题理解 数据结构选择 算法步骤 具体步骤 代码实现&#xff1a; 1.特判&#xff1a; 不需要删除元素的时候 2.在前面的判断结束后&#xff1a;k1&#xff0c;&#xff…

pytest.fixture

pytest.fixture 是 pytest 测试框架中的一个非常强大的功能,它允许你在测试函数运行前后执行一些设置或清理代码。以下是关于 pytest.fixture 的详细介绍: 一、定义与用途 pytest.fixture 是一个装饰器,用于标记一个函数为 fixture。Fixture 函数中的代码可以在测试函数运…

Swift的方法派发机制

1. 静态派发&#xff08;Static Dispatch&#xff09; 静态派发在编译时确定方法的具体实现&#xff0c;调用时直接跳转到该实现。静态派发的优点是性能高&#xff0c;因为不需要运行时查找方法实现。 适用场景&#xff1a; 值类型&#xff08;Struct 和 Enum&#xff09;&am…

C++并发编程指南 09(共享数据)

文章目录 第3章 共享数据本章主要内容共享数据的问题使用互斥保护数据保护数据的替代方案 3.1 共享数据的问题共享数据的核心问题不变量的重要性示例&#xff1a;删除双链表中的节点多线程环境中的问题条件竞争的后果总结3.1.1 条件竞争3.1.2 避免恶性条件竞争 3.2 使用互斥量3…

ZooKeeper 技术全解:概念、功能、文件系统与主从同步

引言 随着分布式系统变得越来越复杂&#xff0c;对协调服务的需求也在不断增长。ZooKeeper 作为一个由 Apache 维护的开源分布式协调服务框架&#xff0c;广泛用于 Hadoop 生态系统和其他需要协调的分布式环境中。这一系统旨在解决分布式应用中常见的挑战&#xff0c;如配置管…

设计方案主要做哪些事情?

目录 1. 需求分析 2. 系统架构设计 3. 数据库设计 4. 接口设计 5. 缓存设计 6. 安全设计 7. 性能优化 8. 高可用与容灾 9. 监控与日志 10. 测试方案 11. 部署方案 12. 文档编写 13. 风险评估 14. 项目管理 总结 设计方案是项目开发的关键步骤,确保项目按计划进…

【语法】C++的内存管理 模板

内存管理&#xff1a; 在C语言中&#xff0c;动态开辟空间可以用malloc&#xff0c;calloc&#xff0c;realloc这三个函数&#xff0c;下面先来复习一下这三者的区别 malloc和calloc都是用来开辟新空间&#xff0c;calloc在malloc的基础上还会初始化该空间为0&#xff0c;用法…

30~32.ppt

目录 30.导游小姚-介绍首都北京❗ 题目​ 解析 31.小张-旅游产品推广文章 题目 解析 32.小李-水的知识❗ 题目​ 解析 30.导游小姚-介绍首都北京❗ 题目 解析 新建幻灯片-从大纲-重置-检查设计→主题对话框→浏览主题&#xff1a;考生文件夹&#xff08;注意&#x…

深度学习-交易预测

下面为你详细介绍如何使用Python结合深度学习库TensorFlow和Keras来构建一个简单的交易预测模型。在这个示例中&#xff0c;我们以股票价格预测为例&#xff0c;假设我们要根据过去一段时间的股票价格数据来预测未来的价格走势。 步骤分析 数据准备&#xff1a;获取股票价格数…

C++ STL Map 学习学案(提高版)

C++ STL Map 学案(初中生版) 一、学习目标 深入理解 STL 中 map 容器的概念、特点和用途。熟练掌握 map 容器的基本操作,如插入、查找、删除和遍历元素。能够运用 map 容器解决实际编程问题,提升逻辑思维和编程实践能力。二、知识讲解 引入 在日常生活中,我们常常会遇到…

uniapp实现人脸识别(不使用三方插件)

uniapp实现人脸识别 内容简介功能实现上传身份证进行人脸比对 遇到的问题 内容简介 1.拍摄/相册将身份证照片上传到接口进行图片解析 2.使用live-pusher组件拍摄人脸照片&#xff0c;上传接口与身份证人脸进行比对 功能实现 上传身份证 先看下效果 点击按钮调用chooseImage…

Evaluating Very Long-Term Conversational Memory of LLM Agents 论文

Abstract : 长期开放域对话的现有作品着重于评估不超过五个聊天会议的上下文中的模型响应。尽管LongContext大语言模型&#xff08;LLM&#xff09;和检索增强发电&#xff08;RAG&#xff09;技术的进步&#xff0c;但在长期对话中的功效仍未得到探索。为了解决这一研究差距&a…

相对收益-固定收益组合归因-Campisi模型

固定收益组合归因-Campisi模型 1 Campisi模型11.1 Campisi归因框架1.2 Campisi模型绝对收益分解1.2.1 票息收益1. 2.2 收敛收益1. 2.3 骑乘收益1. 2.4 平移收益1. 2.5 扭曲收益1. 2.6 利差收益1. 2.7 残差收益 1.3 Campisi模型超额收益分解 2 Campisi模型22.1 分解框架2.2 模型…