React学习———React Router

news2025/5/17 22:51:13

React Router

React Router 是 React 应用中用于管理路由的流行库,它允许你在单页应用(SPA)中实现导航和页面切换而无需重新加载页面。

安装

npm install react-router-dom

核心组件

<BrowserRouter>
  • 使用HTML5的历史记录API(pushStatereplaceStatepopstate事件)来保持UIURL的同步。
  • 通常包裹在应用的根组件中,提供基于浏览器历史记录的路由功能。
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=react
	return (
    <input
      value={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.lazySuspense优化性能
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+)

  • 使用loaderuseLoaderData路由加载时预取数据
// 定义路由时配置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>
  ))
}

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

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

相关文章

MGX:多智能体管理开发流程

MGX的多智能体团队如何通过专家混合系统采用全新方法,彻底改变开发流程,与当前的单一智能体工具截然不同。 Lovable和Cursor在自动化我们的特定开发流程方面取得了巨大飞跃,但问题是它们仅解决软件开发的单一领域。 这就是MGX(MetaGPT X)的用武之地,它是一种正在重新定…

采购流程规范化如何实现?日事清流程自动化助力需求、采购、财务高效协作

采购审批流程全靠人推进&#xff0c;内耗严重&#xff0c;效率低下&#xff1f; 花重金上了OA&#xff0c;结果功能有局限、不灵活&#xff1f; 问题出在哪里&#xff1f;是我们的要求太多、太苛刻吗&#xff1f;NO&#xff01; 流程名称&#xff1a; 采购审批管理 流程功能…

[模型部署] 3. 性能优化

&#x1f44b; 你好&#xff01;这里有实用干货与深度分享✨✨ 若有帮助&#xff0c;欢迎&#xff1a;​ &#x1f44d; 点赞 | ⭐ 收藏 | &#x1f4ac; 评论 | ➕ 关注 &#xff0c;解锁更多精彩&#xff01;​ &#x1f4c1; 收藏专栏即可第一时间获取最新推送&#x1f514;…

Vue3 加快页面加载速度 使用CDN外部库的加载 提升页面打开速度 服务器分发

介绍 CDN&#xff08;内容分发网络&#xff09;通过全球分布的边缘节点&#xff0c;让用户从最近的服务器获取资源&#xff0c;减少网络延迟&#xff0c;显著提升JS、CSS等静态文件的加载速度。公共库&#xff08;如Vue、React、Axios&#xff09;托管在CDN上&#xff0c;减少…

接触感知 钳位电路分析

以下是NG板接触感知电路的原理图。两极分别为P3和P4S&#xff0c;电压值P4S < P3。 电路结构分两部分&#xff0c;第一部分对输入电压进行分压钳位。后级电路使用LM113比较器芯片进行电压比较&#xff0c;输出ST接触感知信号。 钳位电路输出特性分析 输出电压变化趋势&a…

使用 gcloud CLI 自动化管理 Google Cloud 虚拟机

被操作的服务器&#xff0c;一定要开启API完全访问权限&#xff0c;你的电脑安装gcloud CLI前一定要先安装Python3&#xff01; 操作步骤 下载地址&#xff0c;安装大概需要十分钟&#xff1a;https://cloud.google.com/sdk/docs/install?hlzh-cn#windows 选择你需要的版本&a…

SQL语句,索引,视图,存储过程以及触发器

一、初识MySQL 1.数据库 按照数据结构来组织、存储和管理数据的仓库&#xff1b;是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合&#xff1b; 2.OLTP与OLAP OLTP&#xff08; On-Line transaction processing &#xff09;翻译为联机事务处理&am…

7. 进程控制-进程替换

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

理解 C# 中的各类指针

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

真题卷001——算法备赛

蓝桥杯2024年C/CB组国赛卷 1.合法密码 问题描述 小蓝正在开发自己的OJ网站。他要求用户的密码必须符合一下条件&#xff1a; 长度大于等于8小于等于16必须包含至少一个数字字符和至少一个符号字符 请计算一下字符串&#xff0c;有多少个子串可以当作合法密码。字符串为&am…

Vue3中实现轮播图

目录 1. 轮播图介绍 2. 实现轮播图 2.1 准备工作 1、准备至少三张图片&#xff0c;并将图片文件名改为数字123 2、搭好HTML的标签 3、写好按钮和图片标签 ​编辑 2.2 单向绑定图片 2.3 在按钮里使用方法 2.4 运行代码 3. 完整代码 1. 轮播图介绍 首先&#xff0c;什么是…

微信小程序 自定义图片分享-绘制数据图片以及信息文字

一 、需求 从数据库中读取头像&#xff0c;姓名电话等信息&#xff0c;当分享给女朋友时&#xff0c;每个信息不一样 二、实现方案 1、先将数据库中需要的头像姓名信息读取出来加载到data 数据项中 data:{firstName:, // 姓名img:, // 头像shareImage:,// 存储临时图片 } 2…

全栈项目中是否可以实现统一错误处理链?如果可以,这条链路该如何设计?需要哪些技术支撑?是否能同时满足性能、安全性和用户体验需求?

在复杂系统中&#xff0c;错误一旦出现&#xff0c;可能不断扩散&#xff0c;直到让整个系统宕机。尤其在一个全栈项目中&#xff0c;从数据库到服务器端逻辑、再到前端用户界面&#xff0c;错误可能在任意一个环节产生。如果我们不能在全栈范围内实现统一的错误处理机制&#…

排序01:多目标模型

用户-笔记的交互 对于每篇笔记&#xff0c;系统记录曝光次数、点击次数、点赞次数、收藏次数、转发次数。 点击率点击次数/曝光次数 点赞率点赞次数/点击次数 收藏率收藏次数/点击次数 转发率转发次数/点击次数 转发是相对较少的&#xff0c;但是非常重要&#xff0c;例如转发…

Dify中使用插件LocalAI配置模型供应商报错

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

初识计算机网络。计算机网络基本概念,分类,性能指标

初识计算机网络。计算机网络基本概念&#xff0c;分类&#xff0c;性能指标 本系列博客源自作者在大二期末复习计算机网络时所记录笔记&#xff0c;看的视频资料是B站湖科大教书匠的计算机网络微课堂&#xff0c;祝愿大家期末都能考一个好成绩&#xff01; 视频链接地址 一、…

C++ QT图片查看器

private:QList<QString> fs;int i;void MainWindow::on_btnSlt_clicked() {QStringList files QFileDialog::getOpenFileNames(this,"选择图片",".","Images(*.png *.jpg *.bmp)");qDebug()<<files;ui->picList->clear();ui-…

数据集-目标检测系列- 杨桃 数据集 Starfruit>> DataBall

数据集-目标检测系列- 杨桃 数据集 Starfruit&#xff1e;&#xff1e; DataBall * 相关项目 1&#xff09;数据集可视化项目&#xff1a;gitcode: https://gitcode.com/DataBall/DataBall-detections-100s/overview 2&#xff09;数据集训练、推理相关项目&#xff1a;GitH…

【Linux网络】网络套接字编程

套接字编程 一&#xff0c;理解端口号二&#xff0c;初识TCP/UDP协议三&#xff0c;网络字节序四&#xff0c;UDP套接字编程常用API4.1 struct sockaddr类型4.2 socket接口4.3 bind接口4.4 recvfrom4.5 sendto 五&#xff0c;TCP套接字常用API5.1 listen接口5.2 accept接口5.3 …

【data】上海膜拜数据

数据初始样貌 一、数据预处理 1. 数据每5分钟栅格统计 时间数据的处理 path"mobike_shanghai.csv" dfpd.read_csv(path) # 获取时间信息&#xff0c;对于分钟信息&#xff0c;5分钟取整 def time_info(df,col): df[datetime] pd.to_datetime(df[col])df[wee…