【React】 react路由

这一篇文章的重点在于将React关于路由的问题都给搞清楚。
一个路由就是一个映射关系,key:value。key是路径,value 可能是function或者component。
安装react-router-dom包使用路由服务,我这里想要用的是6版本的包,因此后面加”@6"

npm install react-router-dom@6

首先要介绍的是HashRouter和BrowserRouter,这两个组件的作用在于提供一个路由环境,方便在后续React应用程序中使用路由服务。

一、HashRouter和BrowserRouter之间的区别

HashRouter和BrowserRouter之间的区别主要表现在两个方面,一个是表现形式,一个是工作原理。

1. URL表现形式

BrowserRouter的url没有#符号。例如:http://example.com/about
HashRouter的url中包含了一个#符号,该符号后面是hash部分,不会发送到服务器。 例如:http://example.com/#/about

2. 工作原理

对于HashRouter来说,它不需要在服务器中对相应的路由进行配置,它监听hashchange事件,根据hash的变化渲染对应的组件。
对于BrowserRouter来说,他使用Html5中的History api来实现路由。因为不是hash段所以会向服务器端发送请求,需要在服务器中进行相应的配置,均返回index.html网站即可。

跟这两个类似的还有一个MemoryRouter,这里暂不介绍。

上述内容是用来包裹react应用的,使React应用支持路由服务

二、NavLink、Link、Routes和Route

Routes是路由器组,Route必须要用它包裹才能用,Routes的作用是包括Route包裹路由,Route的作用是将组件放在所要定义的位置。

<Routes><Route path="/home" element={<Home />} /><Route path="/about" element={<About />} /><Route path="/" element={<Navigate to="/home" />} />
</Routes>

NavLink与Link按钮之间的区别在于,如果NavLink被点击之后会增加一个active的类名,可以被设置相应的样式,而link没有。
Link与NavLink的作用就相当于是人告诉界面我要显示哪个组件,然后Route的作用是去找组件。

<div><NavLink to="/about">About</NavLink><NavLink to="/home">Home</NavLink>
</div>

在这里插入图片描述
上述内容如下图所示。
路由设置图

三、 useRoutes、路由表、Outlet

路由表
RouteObject
在这里插入图片描述
目前在使用的过程中我只使用了path、children、caseSensitive、element四个基本的配置项。
Index.tsx中定义路由表

import React from "react";
import About from "../components/About";
import Home from "../components/Home";
import News from "../components/News";
import Message from "../components/Message";
import { Navigate } from "react-router-dom";const routes: any[] = [{path: "/about",element: <About />,},{path: "/home",element: <Home />,children: [{path: "news",element: <News />,},{path: "message",element: <Message />,},],},{path: "/",element: <Navigate to="/about" />,},
];
export default routes;

app中引入路由表并使用

import React from "react";
import routes from "./router/index";
import { NavLink, useRoutes } from "react-router-dom";function App() {const element = useRoutes(routes);return (<div className="App"><div><NavLink to="/about">About</NavLink><NavLink to="/home">Home</NavLink></div>{element}</div>);
}export default App;

子路由部分用标签占位,定义插入位置

import React from "react";
import { NavLink, Outlet } from "react-router-dom";export default function Home() {return (<div><h2>Home组件内容</h2><div><NavLink to="news">新闻</NavLink><NavLink to="message">信息</NavLink></div><Outlet /></div>);
}

上述定义均没有涉及样式,样式是在组件里或者html部分自行定义的。

四、路由传参方式

路由传参方式有三种,

1. 一个是useParams接收参数,接收的是路径上的参数,例如:/index/id,接收的是这个id;

首先,是设置路由表的地方跟别的有点区别,因为它是接收路径上的参数。

//在path地方需要进行特殊定义{path: "message",element: <Message />,children: [{path: "detail/:id/:title/:content",element: <Detail />,},],},

其次,传递方式。

import React, { useState } from "react";
import { Link, Outlet } from "react-router-dom";export default function Message() {const [messages] = useState([{ id: "001", title: "消息1", content: "锄禾日当午" },{ id: "002", title: "消息2", content: "汗滴禾下土" },{ id: "003", title: "消息3", content: "谁知盘中餐" },{ id: "004", title: "消息4", content: "粒粒皆辛苦" },]);return (<div><ul>{messages.map((m) => {//   const url = "detail?id=" + m.id + "&title=" + m.title + "&content=" + m.content;return (<li key={m.id}>{/* 模版字符串传参数*/}<Link to={`/home/message/detail/${m.id}/${m.title}/${m.content}`}>{m.title}</Link></li>);})}</ul><hr />{/* 指定子组件所放置的位置 */}<Outlet /></div>);
}

接收参数,useParams

import React from "react";
import { useParams } from "react-router-dom";
export default function Detail() {const { id, title, content } = useParams();return (<div><div><p>id:{id}</p><p>title:{title}</p><p>content:{content}</p></div></div>);
}

useParams()这个方法只用来接收参数。
在这里插入图片描述

2. 第二种是接收url中传递的参数,使用useLocation,例如:/index?id=5,接收的是这个id;

//传递参数的方式<div><ul>{messages.map((m) => {const url ="detail?id=" + m.id + "&title=" + m.title + "&content=" + m.content;return (<li key={m.id}><Link to={url}>{m.title}</Link></li>);})}</ul><hr />{/* 指定子组件所放置的位置 */}<Outlet /></div>//上面传递参数的方式也可以直接用模版字符串来传参
<Link to={`detail?id=${m.id}&title=${m.title}&content=${m.content}`} >

需要使用location对象来接收参数。

//接收参数的方式
import React from "react";
import { useLocation } from "react-router-dom";
export default function Detail() {const location = useLocation();const queryParams = new URLSearchParams(location.search);const [id, title, content] = [queryParams.get("id"),queryParams.get("title"),queryParams.get("content"),];return (<div><div><p>id:{id}</p><p>title:{title}</p><p>content:{content}</p></div></div>);
}

下面是打印出来的location,可以看到下面接收的对象中有哪些数据。

3. 第三种是接收state传递的参数,使用useState.

传递参数

import React, { useState } from "react";
import { Link, Outlet } from "react-router-dom";export default function Message() {const [messages] = useState([{ id: "001", title: "消息1", content: "锄禾日当午" },{ id: "002", title: "消息2", content: "汗滴禾下土" },{ id: "003", title: "消息3", content: "谁知盘中餐" },{ id: "004", title: "消息4", content: "粒粒皆辛苦" },]);return (<div><ul>{messages.map((m) => {//   const url = "detail?id=" + m.id + "&title=" + m.title + "&content=" + m.content;return (<li key={m.id}>{/* 使用state传参 */}<Linkto="detail"state={{ id: m.id, title: m.title, content: m.content }}>{m.title}</Link></li>);})}</ul><hr />{/* 指定子组件所放置的位置 */}<Outlet /></div>);
}

接收参数,上面我们在location对象中看到了state,我们就是接收location对象中的state。

import React from "react";
import { useLocation, useParams } from "react-router-dom";
export default function Detail() {const location = useLocation();const { id, title, content } = location.state;console.log(useParams());return (<div><div><p>id:{id}</p><p>title:{title}</p><p>content:{content}</p></div></div>);
}

useMatch() api返回当前匹配结果。

  console.log(useMatch("/home/message/detail"));

在这里插入图片描述

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

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

相关文章

vue3+uniapp开发鸿蒙初体验

去年7月20号&#xff0c;uniapp官网就已经开始支持鸿蒙应用开发了&#xff0c;话不多说&#xff0c;按照现有规则进行配置实现一下鸿蒙开发效果&#xff1b; 本文基于macOS Monterey 版本 12.6.5实现 开发鸿蒙的前置准备 这里就直接说我的版本&#xff1a; DevEco Studio 5.…

Git代码管理工具 — 5 GitHub远程仓库

目录 1 常用的代码托管平台 2 GitHub平台详解 2.1 github简介 2.2 Github基本功能介绍 3 GitHub创建远程仓库 3.1 创建远程仓库 3.2 创建远程仓库别名 4 推送本地分支到远程仓库 5 拉取远程库到本地 6 克隆远程库到本地 1 常用的代码托管平台 前面我们已经知道了Git…

UDP 广播组播点播的区别及联系

1、网络IP地址的分类 组播地址是分类编址的IPv4地址中的D类地址&#xff0c;又叫多播地址&#xff0c;他的前四位必须是1110&#xff0c;所以网络地址的二进制取值范围是11100000~11101111对应的十进制为 224~~239。所以以224~239开头的网络地址都是组播地址。 组播地址的功能…

mysql 学习2 MYSQL数据模型,mysql内部可以创建多个数据库,一个数据库中有多个表;表是真正放数据的地方,关系型数据库 。

在第一章中安装 &#xff0c;启动mysql80 服务后&#xff0c;连接上了mysql&#xff0c;那么就要 使用 SQL语句来 操作mysql数据库了。那么在学习 SQL语言操作 mysql 数据库 之前&#xff0c;要对于 mysql数据模型有一个了解。 MYSQL数据模型 在下图中 客户端 将 SQL语言&…

10个非常基础的 Javascript 问题

Javascript是一种用于Web开发的编程语言。JavaScript在网络的客户端上运行。 根据MDN&#xff0c;JavaScript&#xff08;通常缩写为JS&#xff09;是一种轻量级的&#xff0c;解释性的&#xff0c;面向对象的语言&#xff0c;具有一流的功能&#xff0c;并且最著名的是Web页面…

把 PVE 下的机械硬盘(非SSD系统盘)分配给虚拟机使用

PVE 挂在硬盘 参考 Ubuntu 24.04 LTS 空闲硬盘挂载到 文件管理器的 other locations。 在 PVE shell 中根据上面教程挂在硬盘 新建分享目录 参考 Proxmox VE&#xff08;PVE&#xff09;添加硬盘做存储 虚拟机新增硬盘 虚拟机 关机&#xff0c;按下图新增硬盘 新增硬盘…

制作动态菜单

动态菜单的说明 什么叫做动态菜单&#xff1f;动态菜单就是根据用户属于不同的角色&#xff0c;每个角色还有不同的菜单&#xff0c;左侧菜单栏会有不同的显示 前端加载流程 menu.js 修改/src/api/menu.js中的请求地址&#xff0c;如下所示&#xff1a; // 获取菜单 export…

C语言数组详解:从基础到进阶的全面解析

在C语言中&#xff0c;数组是一种基本的数据结构&#xff0c;用于存储多个相同类型的数据。数组的引入使得C语言能够高效地存储和操作大量数据。在任何一个C语言程序中&#xff0c;数组都发挥着极其重要的作用。无论是在算法实现、数据存储、还是在复杂程序的设计中&#xff0c…

什么是COLLATE排序规则?

在当今数字化世界中&#xff0c;数据的整理、比较和排序是至关重要的。在数据库管理和编程语言中&#xff0c;我们经常需要对字符串进行排序&#xff0c;以展示或处理信息。为了实现这一点&#xff0c;各种系统和工具提供了排序规则&#xff0c;其中COLLATE排序规则就是其中的一…

【数据结构进阶】红黑树超详解 + 实现(附源码)

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;数据结构 目录 前言 一、红黑树介绍 二、红黑树原理详解 三、红黑树的实现 1. 节点定义 2. 红黑树类型定义及接口声明 3. 红黑树的插入&#xff08;重点&a…

计算机网络 (57)改进“尽最大努力交付”的服务

前言 计算机网络中的“尽最大努力交付”服务是网络层的一种数据传输方式。这种服务的特点是网络层只负责尽力将数据报从源端传输到目的端&#xff0c;而不保证数据传输的可靠性。 一、标记与分类 为数据分组打上标记&#xff1a; 给不同性质的分组打上不同的标记&#x…

ThinkPHP 8模型与数据的插入、更新、删除

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 使用VS Code开发ThinkPHP项目-CSDN博客 编程与应用开…

【数据可视化】全国星巴克门店可视化

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

密码无关认证:金融机构如何解决密码问题

密码安全问题&#xff0c;依然是金融行业面临的重大挑战。尽管密码简单易用&#xff0c;但许多金融机构仍然依赖这种方式进行身份认证。幸运的是&#xff0c;随着技术的发展&#xff0c;密码无关认证已经成为一种更加安全、便捷的选择&#xff0c;它能够为数字银行带来更好的用…

【Redis】持久化机制

目录 前言&#xff1a; RDB 触发RDB持久化方法有俩种&#xff1a; 1.手动触发 2.自动触发 RDB文件的优缺点&#xff1a; AOF: AOF工作机制&#xff1a;​编辑 ​编辑重写机制&#xff1a; 前言&#xff1a; Redis是一个内存数据库&#xff0c;将数据存储在内存中&…

Vue基础(2)

19、组件之间传递数据 组件与组件之间不是完全独立的&#xff0c;而是有交集的&#xff0c;那就是组件与组 件之间是可以传递数据的 传递数据的解决方案就是 props ComponentA.vue <template><!-- 使用ComponentB组件&#xff0c;并传递title属性 --><h3>…

Java操作Excel导入导出——POI、Hutool、EasyExcel

目录 一、POI导入导出 1.数据库导出为Excel文件 2.将Excel文件导入到数据库中 二、Hutool导入导出 1.数据库导出为Excel文件——属性名是列名 2.数据库导出为Excel文件——列名起别名 3.从Excel文件导入数据到数据库——属性名是列名 4.从Excel文件导入数据到数据库…

08-ArcGIS For JavaScript-通过Mesh绘制几何体(Cylinder,Circle,Box,Pyramid)

目录 概述代码实现1、Mesh.createBox2、createPyramid3、Mesh.createSphere4、Mesh.createCylinder 完整代码 概述 对于三维场景而言&#xff0c;二位的点、线、面&#xff0c;三维的圆、立方体、圆柱等都是比较常见的三维对象&#xff0c;在ArcGIS For JavaScript中我们知道点…

DAY6,使用互斥锁 和 信号量分别实现5个线程之间的同步

题目 请使用互斥锁 和 信号量分别实现5个线程之间的同步 代码&#xff1a;信号量实现 void* task1(void* arg); void* task2(void* arg); void* task3(void* arg); void* task4(void* arg); void* task5(void* arg);sem_t sem[5]; //信号量变量int main(int argc, const …

19_PlayerPres持久化_创建角色窗口

创建脚本 编写脚本 using UnityEngine; //功能 : 角色创建界面 public class CreateWnd : WindowsRoot{protected override void InitWnd(){base.InitWnd();//TODO//显示一个随机名字} }创建角色窗口CreateWnd.cs应该在玩家点击 进入游戏 按钮后显示 所以在 登录窗口LoginWnd…