React学习———React Router
React Router
React Router 是 React 应用中用于管理路由的流行库,它允许你在单页应用(SPA)中实现导航和页面切换而无需重新加载页面。
安装
npm install react-router-dom
核心组件
<BrowserRouter>
- 使用
HTML5
的历史记录API(pushState
、replaceState
和popstate
事件)来保持UI
与URL
的同步。 - 通常包裹在应用的根组件中,提供基于浏览器历史记录的路由功能。
import { BrowserRouter } from 'react-router-dom'
function App(){return (<BrowserRouter >{/* 其他组件 */}</BrowserRouter >)
}
<HashRouter>
- 通过监听浏览器的
hashchange
事件来检测路由变化,因为hash
部分不会被服务器解析,所以无需服务器支持。 - 使用方法和
BrowserRouter
一致,适合静态部署或后端不支持history
路由的场景
<Routes>
和<Route>
<Routes>
:包裹所有路由规则<Route>
:定义单个路由,通过path
属性指定URL
路径、element
属性/component
属性指定要渲染的组件
import { Routes, Route } from 'react-router-dom'
function App() {return (<Routes><Route path="/" element={<Home />} /></Routes>);
}
<Link>
- 用于应用内导航,替代
<a>
标签实现导航,生成一个不会导致页面重新加载的链接,避免页面刷新
import { Link } from 'react-router-dom'
function Navbar() {return (<nav><Link to="/" >Home</Link></nav>);
}
<Navigate>
- 用于编程式导航或重定向,例如:当用户访问某个路径时,可以自动重定向到另一个路径
<Route path="/old-path" element={<Navigate to="/new-path" />} />
动态路由
- 通过在路由
path
中使用冒号:参数名
定义参数
import { Route, Routes } from 'react-router-dom'
import User from './User'
<Routes>// 这样 /user/123、/user/abc都会匹配该路由<Route path="/user/:id" element={<User />} />
</Routes>
- 使用
*
通配符匹配任意路径
import { Route, Routes } from 'react-router-dom'
import User from './User'
<Routes>// 这样 /user/xxx/yyy都会匹配该路由<Route path="/user/*" element={<User />} />
</Routes>
获取URL参数
: 通过useParams
获取动态路径参数
import { useParams } from 'react-router-dom'
function User(){const { id } = useParams()return <div>用户ID:{id}</div>
}
获取查询参数
:通过useSearchParams
获取和修改查询参数
import { useSearchParams} from 'react-router-dom'
function SearchPage(){const [searchParams, setSearchParams] = useSearchParams();const keyword = searchParams.get("q"); // 例如 /search?q=reactreturn (<inputvalue={keyword || ""}onChange={(e) => setSearchParams({ q: e.target.value })}/>);
}
嵌套路由
- 在父路由中定义子路由,用
<Outlet>
指定子路由渲染位置
// 父组件---使用 <Outlet> 指定子组件的位置:
function Dashboard(){return (<div><h1>Dashboard</h1>{/* 子路由内容在此渲染 */}<Outlet /> </div>)
}// 通过 <Route> 的嵌套结构实现:
<Route path="/dashboard" element={<Dashboard />}><Route path="stats" element={<Stats />} /><Route path="settings" element={<Settings />} />
</Route>
编程试导航
- 使用
useNavigate
钩子进行跳转
import { useNavigate } from "react-router-dom";
function LoginButton() {const navigate = useNavigate();return (<button onClick={() => {// 跳转到指定路径navigate("/dashboard");// 替换历史记录(无后退)navigate("/dashboard", { replace: true });// 带状态传递navigate("/dashboard", { state: { from: "login" } });}}>Login</button>);
}
路由懒加载(代码分割)
- 使用
React.lazy
和Suspense
优化性能
import React, { lazy, Suspense } from 'react'
import { Routes, Route } from 'react-router-dom'const Home = lazy(() => import('./home.jsx'))
function App(){return (// fallback属性可以自定义加载时的占位内容(如loading动画)<Suspense fallback={<div>加载中。。。</div>}><Routes><Route path='/' element={<Home />}></Route></Routes></Suspense>)
}
高阶组件实现权限控制
- 高阶组件是一种用于复用组件逻辑的高级技术;采用函数接收组件,返回新组件的模式。
function PrivateRoute({children}){consr isAdmin = checkAuth()return isAdmin ? children : <Navigate to='/login' />
}<Route path='/admin' element={<PrivateRoute><Home />
</PrivateRoute>} />
数据加载(v6.4+)
- 使用
loader
和useLoaderData
在路由加载时预取数据
// 定义路由时配置loader
const router = createBrowserRouter([{path: '/user/:userId',element: <User />loader: async ({ params }) => {// 根据URL传递的数据进行接口请求const res = await fetch(`/api/users/${params.userId}`)return res.json()}}
])// 组件中获取数据
import { useLoaderData } from 'react-router-dom'
function User(){// 直接获取 loader 返回的数据const userData = useLoaderData(); return <div>{userData.name}</div>;
}
路由配置简单demo
- 在
src
目录下创建一个router
文件夹管理路由列表
// 用于编程式导航 重定向
import { Navigate } from 'react-router-dom'
// 高阶组件实现权限控制
import AuthRoute from '@/components/AuthRoute'
// 界面排版组件
import Layout from '@/pages/Layout'
import Admin from '@/pages/Admin'
import Login from '@/pages/Login'export const routesList = [{path: '/',element: <Navigate to="/home" />},{path: '/login',element: <Login />},{path: '/admin',element: <Admin />children: [{ { path: 'optical', element: <AuthRoute ><OpticalManage /></AuthRoute> }, }]},
]
- 在
App.tsx
进行路由配置
interface PageRoute{path: string,element: React.ReactNode,children?: PageRoute[]
}// 使用递归实现 Route 的渲染
function renderRoutes(routes: PageRoute[]) {return routes.map(({ path, element, children }, index) => (<Route key={path || index} path={path} element={element}>{children && renderRoutes(children)}</Route>))
}
function App() {const loading = useSelector<RootState, boolean>(state => state.head.loading)return (<div className="app-view">{loading && <Loading />}<Routes>{ renderRoutes(routesList) }</Routes></div>)
}export default App
常见坑
箭头函数体
用{}
时,必须显示写return
function renderRoutes(routes: PageRoute[]) {return routes.map(({ path, element, children }, index) => {return <Route key={path || index} path={path} element={element}>{children && renderRoutes(children)}</Route>});
}
- 用
()
时,直接返回表达式
function renderRoutes(routes: PageRoute[]) {return routes.map(({ path, element, children }, index) => (<Route key={path || index} path={path} element={element}>{children && renderRoutes(children)}</Route>))
}
相关文章:
React学习———React Router
React Router React Router 是 React 应用中用于管理路由的流行库,它允许你在单页应用(SPA)中实现导航和页面切换而无需重新加载页面。 安装 npm install react-router-dom核心组件 <BrowserRouter> 使用HTML5的历史记录API&#…...

MGX:多智能体管理开发流程
MGX的多智能体团队如何通过专家混合系统采用全新方法,彻底改变开发流程,与当前的单一智能体工具截然不同。 Lovable和Cursor在自动化我们的特定开发流程方面取得了巨大飞跃,但问题是它们仅解决软件开发的单一领域。 这就是MGX(MetaGPT X)的用武之地,它是一种正在重新定…...
现在环保方面有什么新的技术动态
环保领域的技术发展迅速,尤其在“双碳”目标、数字化转型和可持续发展背景下,涌现出许多创新技术和应用。以下是当前环保领域的新技术动态(截至2024年): 一、碳中和与碳减排技术 CCUS(碳捕集、利用与封存&a…...
归并排序:分治思想的优雅实现
归并排序(Merge Sort)以简洁而高效的分治思想,在众多排序算法中占据着重要的地位。今天,就让我们一同深入探索归并排序的奥秘。 一、归并排序简介 归并排序是一种基于分治策略的排序算法。它的核心思想是将一个大的问题分解成若…...

采购流程规范化如何实现?日事清流程自动化助力需求、采购、财务高效协作
采购审批流程全靠人推进,内耗严重,效率低下? 花重金上了OA,结果功能有局限、不灵活? 问题出在哪里?是我们的要求太多、太苛刻吗?NO! 流程名称: 采购审批管理 流程功能…...

[模型部署] 3. 性能优化
👋 你好!这里有实用干货与深度分享✨✨ 若有帮助,欢迎: 👍 点赞 | ⭐ 收藏 | 💬 评论 | ➕ 关注 ,解锁更多精彩! 📁 收藏专栏即可第一时间获取最新推送🔔…...

Vue3 加快页面加载速度 使用CDN外部库的加载 提升页面打开速度 服务器分发
介绍 CDN(内容分发网络)通过全球分布的边缘节点,让用户从最近的服务器获取资源,减少网络延迟,显著提升JS、CSS等静态文件的加载速度。公共库(如Vue、React、Axios)托管在CDN上,减少…...

接触感知 钳位电路分析
以下是NG板接触感知电路的原理图。两极分别为P3和P4S,电压值P4S < P3。 电路结构分两部分,第一部分对输入电压进行分压钳位。后级电路使用LM113比较器芯片进行电压比较,输出ST接触感知信号。 钳位电路输出特性分析 输出电压变化趋势&a…...
彻底删除Docker容器中的环境变量
彻底删除Docker容器中的环境变量 前言:环境变量的重要性第一步:创建实验容器第二步:验证环境变量第三步:定位容器"身份证"第四步:修改"出生证明"(重要!)第五步:验证手术成果技术原理深度剖析更安全的替代方案常见问题解答结语:知其然更要知其所以…...

使用 gcloud CLI 自动化管理 Google Cloud 虚拟机
被操作的服务器,一定要开启API完全访问权限,你的电脑安装gcloud CLI前一定要先安装Python3! 操作步骤 下载地址,安装大概需要十分钟:https://cloud.google.com/sdk/docs/install?hlzh-cn#windows 选择你需要的版本&a…...

SQL语句,索引,视图,存储过程以及触发器
一、初识MySQL 1.数据库 按照数据结构来组织、存储和管理数据的仓库;是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合; 2.OLTP与OLAP OLTP( On-Line transaction processing )翻译为联机事务处理&am…...
在Web应用中集成Google AI NLP服务的完整指南:从Dialogflow配置到高并发优化
在当今数字化客服领域,自然语言处理(NLP)技术已成为提升用户体验的关键。Google AI提供了一系列强大的NLP服务,特别是Dialogflow,能够帮助开发者构建智能对话系统。本文将详细介绍如何在Web应用中集成这些服务,解决从模型训练到高并发处理的全套技术挑战。 一、Dialogflow…...

7. 进程控制-进程替换
目录 1. 进程替换 1.1 单进程版: 1.2 进程替换的原理 1.3 多进程版-验证各种程序替换接口 2. 进程替换的各种接口 2.1 execl 2.2 execlp 2.3 execv 2.4 execvp 2.5 execle 1. 进程替换 上图为程序替换的接口,之后会详细介绍。 1.1 单进程版&am…...

理解 C# 中的各类指针
前言 变量可以理解成是一块内存位置的别名,访问变量也就是访问对应内存中的数据。 指针是一种特殊的变量,它存储了一个内存地址,这个内存地址代表了另一块内存的位置。 指针指向的可以是一个变量、一个数组元素、一个对象实例、一块非托管内存…...

真题卷001——算法备赛
蓝桥杯2024年C/CB组国赛卷 1.合法密码 问题描述 小蓝正在开发自己的OJ网站。他要求用户的密码必须符合一下条件: 长度大于等于8小于等于16必须包含至少一个数字字符和至少一个符号字符 请计算一下字符串,有多少个子串可以当作合法密码。字符串为&am…...
Qt图表库推荐指南与分析
目录 一、核心图表库横向对比1. Qt Charts2. QCustomPlot3. QWT (Qt Widgets for Technical Applications)4. KD Chart二、性能与功能对比矩阵三、选型策略与组合方案1. 通用型需求:2. 技术型场景:3. 企业级开发:四、未来趋势与避坑指南1. 协议风险:2. 技术兼容性:3. 性能…...
【Dv3Admin】工具视图配置文件解析
在开发后台管理系统时,处理复杂的 CRUD 操作是常见的需求。Django Rest Framework(DRF)通过 ModelViewSet 提供了基础的增删改查功能,但在实际应用中,往往需要扩展更多的功能,如批量操作、权限控制、查询优化等。dvadmin/utils/viewset.py 模块通过继承并扩展 ModelViewS…...

Vue3中实现轮播图
目录 1. 轮播图介绍 2. 实现轮播图 2.1 准备工作 1、准备至少三张图片,并将图片文件名改为数字123 2、搭好HTML的标签 3、写好按钮和图片标签 编辑 2.2 单向绑定图片 2.3 在按钮里使用方法 2.4 运行代码 3. 完整代码 1. 轮播图介绍 首先,什么是…...
C#中UI线程的切换与后台线程的使用
文章速览 UI线程切换示例 后台线程使用示例 两者对比适用场景Application.Current.Dispatcher.InvokeTask.Factory.StartNew 执行同步性Application.Current.Dispatcher.InvokeTask.Factory.StartNew 一个赞,专属于你的足迹! UI线程切换 在WPF应用程序…...

微信小程序 自定义图片分享-绘制数据图片以及信息文字
一 、需求 从数据库中读取头像,姓名电话等信息,当分享给女朋友时,每个信息不一样 二、实现方案 1、先将数据库中需要的头像姓名信息读取出来加载到data 数据项中 data:{firstName:, // 姓名img:, // 头像shareImage:,// 存储临时图片 } 2…...
优艾智合机器人助力半导体智造,领跑国产化替代浪潮
在全球半导体产业加速自动化转型的背景下,传统物流已成为制约智能化升级的关键瓶颈。作为中国移动机器人行业的领军企业,优艾智合(YOUIBOT)自2017年起就敏锐洞察到"半导体设备国产化"的紧迫需求,依托在工业移…...
关于 TCP 端口 445 的用途以及如何在 Windows 10 或 11 上禁用它
TCP 端口 445 主要用于直接通过 TCP/IP 访问 Microsoft 网络,无需使用 NetBIOS 层。此服务自 Windows 2000 和 Windows XP 开始在 Windows 中提供。在 Windows NT/2K/XP 中,SMB(Server Message Block)协议用于文件共享等。它在 Windows NT 中运行在 NetBT(NetBIOS over TC…...
C语言_coredump深度解析
在 C/C++ 开发中,Core Dump 是解决程序崩溃问题的重要手段。本文将系统介绍 Core Dump 的概念、用途、常见原因及调试方法,结合具体代码示例,帮助开发者快速定位和解决问题。 一、Core Dump 是什么? Core Dump(核心转储)是操作系统在进程异常终止时,将进程的内存镜像、…...

全栈项目中是否可以实现统一错误处理链?如果可以,这条链路该如何设计?需要哪些技术支撑?是否能同时满足性能、安全性和用户体验需求?
在复杂系统中,错误一旦出现,可能不断扩散,直到让整个系统宕机。尤其在一个全栈项目中,从数据库到服务器端逻辑、再到前端用户界面,错误可能在任意一个环节产生。如果我们不能在全栈范围内实现统一的错误处理机制&#…...
Twitter数据采集新选择:twitterapi.io全面评测与实战指南
之前我在CSDN上分享过如何高效获取Twitter数据:Apify平台上的推特数据采集解决方案_tweet scraper v2 (pay per result)-CSDN博客,当时介绍了如何利用Apify平台抓取Twitter数据。虽然Apify提供了不错的解决方案,但在实际项目中我遇到了一些瓶…...

排序01:多目标模型
用户-笔记的交互 对于每篇笔记,系统记录曝光次数、点击次数、点赞次数、收藏次数、转发次数。 点击率点击次数/曝光次数 点赞率点赞次数/点击次数 收藏率收藏次数/点击次数 转发率转发次数/点击次数 转发是相对较少的,但是非常重要,例如转发…...

Dify中使用插件LocalAI配置模型供应商报错
服务器使用vllm运行大模型,今天在Dify中使用插件LocalAI配置模型供应商后,使用工作流的时候,报错:“Run failed: PluginInvokeError: {"args":{},"error_type":"ValueError","message":&…...

初识计算机网络。计算机网络基本概念,分类,性能指标
初识计算机网络。计算机网络基本概念,分类,性能指标 本系列博客源自作者在大二期末复习计算机网络时所记录笔记,看的视频资料是B站湖科大教书匠的计算机网络微课堂,祝愿大家期末都能考一个好成绩! 视频链接地址 一、…...
【Python 操作 MySQL 数据库】
在 Python 中操作 MySQL 数据库主要通过 pymysql 或 mysql-connector-python 库实现。以下是完整的技术指南,包含连接管理、CRUD 操作和最佳实践: 一、环境准备 1. 安装驱动库 pip install pymysql # 推荐(纯Python实现࿰…...
标贝科技:大模型领域数据标注的重要性与标注类型分享
当前,大模型作为人工智能领域的前沿技术,其强大的泛化能力和复杂任务处理能力,依赖于海量数据的训练。而数据标注,作为连接原始数据与大模型训练的关键桥梁,在这一过程中发挥着举足轻重的作用。 大模型的训练依赖海…...