第40节——路由初识,定义路由组件

文档地址
http://www.reactrouter.cn/docs/getting-started/tutorial

version

V6.x

一、什么是路由

前端路由指的是一种将浏览器URL与特定页面或视图关联起来的技术。在传统的Web开发中,当用户点击链接或者输入URL时,服务器会接收到请求并返回相应的HTML页面。而在前端路由中,当用户点击链接或者输入URL时,浏览器会根据路由规则对URL进行解析,并使用JavaScript控制页面的展示。

前端路由通常使用JavaScript库来实现,比如React Router、Vue Router等。它们允许开发者定义路由规则,并根据这些规则来显示不同的组件或页面。例如,当用户点击一个链接时,前端路由会将URL解析为一个路由路径,然后根据路径匹配相应的组件或页面并显示在页面上,而不需要向服务器发起请求。

前端路由可以提高Web应用的性能和用户体验,因为它允许应用实现快速的页面切换和动态的内容加载,同时减少了服务器的负载。

二、安装

// 注意:我们用的是6.x的版本
npm install react-router-dom

三、路由模式

1、HashRouter

HashRouter使用URL的哈希部分(即#后面的部分)来匹配路由,它不会向服务器发送请求。例如,URL可以是http://example.com/#/about。HashRouter兼容性比较好,哪怕浏览器不支持HTML5 History API也可以正常使用。

2、BrowserRouter

BrowserRouter使用HTML5 History API来匹配路由,使用 HTML5 的 pushState 和 replaceState API 来实现路由的切换。它可以隐藏URL中的#符号,使URL更加友好。例如,URL可以是http://example.com/about

3、MemoryRouter

MemoryRouter是一个不依赖于浏览器历史记录的路由器。它将URL存储在内存中,而不是浏览器历史记录中,适用于测试或在不支持HTML5 History API的环境中使用

4、StaticRouter

StaticRouter是一个用于服务器端渲染的路由器。它将请求的URL作为参数传递给组件,并将组件的输出发送回客户端。这样就可以在服务器端生成动态HTML,然后将其发送到浏览器。

5、NativeRouter

NativeRouter是用于React Native应用的路由器,它使用Native导航而不是HTML导航来匹配路由

接下来我们以HashRouter模式为例进行我们的路由学习

四、react-router-dom 有哪些组件

1、HashRouter组件以及其他路由模式组件

用于创建一个路由容器,使得我们可以在浏览器中使用路由。它包裹整个应用程序,并提供了一个路由的上下文环境。

2、Route组件

用于将一个路由路径与一个组件进行映射。当浏览器 URL 与 Route 组件所定义的路径匹配时,该组件就会被渲染到页面上

常用属性
属性名类型默认值描述
pathstring用于匹配 URL 的路径。
elementReactNode指定路由匹配成功后要渲染的组件。
caseSensitivebooleanfalse指定路径匹配时是否区分大小写。
sensitivebooleanfalse指定路径匹配时是否严格匹配大小写和斜杠。
locationstring | object指定要匹配的位置。
navigatebooleantrue当路由匹配成功后是否进行页面导航。
elementPropsobject传递给渲染组件的属性对象。
preloadfunction用于预加载组件。
caseSensitivebooleanfalse指定路径匹配时是否区分大小写。
sensitivebooleanfalse指定路径匹配时是否严格匹配大小写和斜杠。
redirectTostring当路由匹配成功后要重定向到的路径。
redirectPathstring当路由匹配成功后要重定向到的路径。
replacebooleanfalse当页面导航时是否使用 replace 而非 push
caseSensitivebooleanfalse指定路径匹配时是否区分大小写。
sensitivebooleanfalse指定路径匹配时是否严格匹配大小写和斜杠。
preventDefaultbooleanfalse是否阻止默认的页面导航行为。
whenboolean | functrue指定条件是否匹配,用于控制是否进行页面导航。
classNamestring为路由渲染的元素指定 CSS 类名。
styleobject为路由渲染的元素指定样式对象。
titlestring页面标题,用于在路由变化时更新页面标题。
metaany
例子
import { Route, Routes } from 'react-router-dom';function App() {return (<div><Routes><Route exact path="/" element={Home} /><Route path="/about" element={About} /></Routes></div>);
}

3、Routes组件

Routes 组件是 React Router v6 中的一个组件,它的作用是用于定义应用程序的路由规则。与 React Router v5 中的 组件类似,Routes 组件包含多个 子组件,用于指定不同的路径和对应的组件。

Routes 组件可以让我们更加灵活地定义路由规则。与 React Router v5 中的 组件只能按顺序匹配第一个符合条件的路由不同,Routes 组件可以匹配多个路由,并根据 path 属性的优先级选择最匹配的路由。例如,如果同时定义了 /users/:id 和 /users/new 两个路由规则,当访问 /users/new 时,React Router v6 会选择匹配优先级更高的 /users/new 路由,而不是直接匹配第一个符合条件的路由

import { Route, Routes } from 'react-router-dom';function App() {return (<Routes><Route exact path="/" element={Home} /><Route path="/about" element={About} /></Routes>);
}

4、Link组件

用于创建一个链接,使得用户可以通过点击链接来访问应用程序的不同路由路径。它会生成一个 标签,并根据传入的 to 属性生成正确的 href 属性。

import { Link } from 'react-router-dom';function Home() {return (<div><ul><li><Link to="/a">A页面</Link></li><li><Link to="/b">B页面</Link></li></ul></div>);
}

5、NavLink

与 类似,也用于创建一个链接,但它会在当前路由匹配成功时添加一个指定的类名,以便样式上的区分。

import { NavLink } from 'react-router-dom';/**
当点击链接的时候会自动激活activeClassName属性的className
*/
function Navbar() {return (<nav><ul><li><NavLink to="/a" activeClassName="active">a页面</NavLink></li><li><NavLink to="/b" activeClassName="active">b页面</NavLink></li></ul></nav>);
}

6、Redirect

用于重定向用户到另一个路由路径。当用户访问当前路径时,会自动跳转到指定的路径。

在使用Redirect组件时,您需要在路由配置中使用它而不是在组件中使用它。例如,如果您想在用户访问/home时重定向到/dashboard,则可以像这样设置路由

import { Route, Routes, Redirect } from 'react-router-dom';
import Dashboard from './Dashboard';function App() {return (<Routes><Route path="/dashboard" element={<Dashboard />} /><Route path="/home" element={<Redirect to="/dashboard" />} /></Routes>);
}

7、Prompt

用于在用户离开当前页面之前提示用户。可以用来防止用户在填写表单时误操作导致数据丢失。

五、react-router-dom中常用的hooks

1、useNavigate

用于在组件中进行导航、跳转等操作,与 useHistory 功能类似,但提供了更丰富的 API,例如可以使用命名路由进行跳转。

所谓的命名理由就是Route组件上定义的name属性,然后在跳转的时候直接穿name即可。

2、useParams

用于获取 URL 中的参数,例如 /users/:id 中的 id

3、useLocation

用于访问当前页面的位置信息,包括 URL 中的路径、查询参数、哈希等。

4、useMatch

用于获取当前页面的匹配信息,例如路由规则中的路径、参数等,与 useRouteMatch 功能类似

5、useOutlet

用于在父组件中呈现子路由组件,可以将子路由组件放在特定位置。也就是展示嵌套路由。

import { useOutlet } from 'react-router-dom';function App() {const outlet = useOutlet();return (<div><h1>这是应用程序的头部</h1>{/* 在这里渲染子路由组件 */}{outlet}<h1>这是应用程序的底部</h1></div>);
}

路由定义嵌套路由

import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';function App() {return (<Router><Routes><Route path="/" element={<Home />} /><Route path="/about" element={<About />} /><Route path="/users" element={<Users />}>{/* 子路由 */}<Route path="/" element={<UserList />} /><Route path=":id" element={<UserProfile />} /></Route></Routes></Router>);
}

6、useRoutes

根据规则动态渲染路由。

注意:

在使用 useRoutes 钩子函数时,需要将其作为根组件渲染,而不是将其作为子组件嵌套在其他组件中。这是因为 useRoutes 钩子函数需要访问 react-router-dom 的上下文,从而能够进行路由匹配和导航操作。

import { useRoutes } from 'react-router-dom';function App() {const routes = useRoutes([{ path: '/', element: <Home /> },{ path: '/about', element: <About /> },{ path: '/contact', element: <Contact /> },{ path: '/users/:id', element: <User /> },]);return <div>{routes}</div>;
}

六、基本使用

1、创建a、b、c三个组件文件,内容任意

2、创建router-component.jsx文件

/*** 从react-router-dom中 引用HashRouter 是一个组件* 如果需要别的模式那就引入其他模式**/
import React from "react";
import { HashRouter, Route, Routes } from "react-router-dom";
import APage from "./learn-router/a";
import BPage from "./learn-router/b";
import CPage from "./learn-router/c";export default function RouterComponent() {return (// 首先确定什么模式,那么最上层组件就是用这个模式<HashRouter><Routes><Route path="/" element={<APage />} /><Route path="/b" element={<BPage />} /><Route path="/b" element={<CPage />}></Route></Routes></HashRouter>);
}

3、在入口文件处引入

import React from "react";
import ReactDOM from "react-dom/client";
import RouterComponent from "./rotuerComponent";const root = ReactDOM.createRoot(document.getElementById("root"));root.render(<RouterComponent />
);

4、在url地址直接输入地址就可以切换不同的页面

http://localhost:3000/

http://localhost:3000/#/b

http://localhost:3000/#/c

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

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

相关文章

信创办公–基于WPS的PPT最佳实践系列 (项目8创建电子相册)

信创办公–基于WPS的PPT最佳实践系列 &#xff08;项目8创建电子相册&#xff09; 目录 应用背景操作步骤 应用背景 如果我们想把图片弄成相册&#xff0c;或者弄成一段有音乐的视频分享给朋友。我们可以利用PPT来制作。那我们如何用PPT制作电子相册或视频呢&#xff1f;可以跟…

2012 款宝马 X6 xDrive35i 车 中央显示屏经常会提示“发动机异常”

故障现象 一辆2012 款宝马X6 xDrive35i车&#xff08;开发系列号为E71&#xff09;&#xff0c;搭载N55发动机&#xff0c;累计行驶里程约为21.2万km。车主反映&#xff0c;车辆加速过程中&#xff0c;中央显示屏经常会提示“发动机异常”。 故障诊断 接车后&#xff0c;进行路…

零代码编程:用ChatGPT批量将多个文件夹中的视频转为音频

有多个文件夹中的 视频&#xff0c;都要批量转换成音频格式。 转换完成后要删除视频。虽然现在已经有很多格式转换软件可以实现这个功能&#xff0c;但是需要一个个文件夹的操作&#xff0c;还要手动去删除视频。用ChatGPT来写一个批量自动操作程序吧&#xff1a; 输入提示词如…

Matlab随机数的产生

1、常见分布随机数的产生 1.1 二项分布 在贝努力试验中&#xff0c;某事件A发生的概率为p&#xff0c;重复该实验n次&#xff0c;X表示这n次实验中A发生的次数&#xff0c;则随机变量X服从的概率分布律&#xff08;概率密度&#xff09;为 记为 binopdf(x,n,p) p…

【深度学习实验】卷积神经网络(六):卷积神经网络模型(VGG)训练、评价

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. 构建数据集&#xff08;CIFAR10Dataset&#xff09; a. read_csv_labels&#xff08;&#xff09; b. CIFAR10Dataset 2. 构建模型&#xff08;FeedForward&…

uni-app:获取元素宽高

效果 代码 这里我定义的宽为500px,高为200排序,控制台输出的结果是502,202。原因是我设置了上下左右宽度各为1px的border边框导致 核心代码分析 // const query uni.createSelectorQuery();表示创建了一个选择器查询实例。通过这个实例&#xff0c;你可以使用不同的方法来选择…

数据库数据恢复-SQL SERVER数据库分区被格式化的数据恢复方案

SQL SERVER数据库故障类型&#xff1a; 1、SQL SERVER数据库文件被删除。 2、SQL SERVER数据库所在分区格式化。 3、SQL SERVER数据库文件大小变为“0”。 4、使用备份还原数据库时覆盖原数据库。 SQL SERVER数据库故障原因&#xff1a; 1、人为误操作。 2、文件系统损坏&#…

vue安装步骤

1、winR ->cmd 打开运行窗口 2、如下两种方式&#xff0c;测试电脑现有vue版本&#xff0c;提示"MODULE_NOT_FOUND"错误 (1)方式一&#xff1a;vue -V (2)方式二&#xff1a;vue -version 3、输入以下命令&#xff1a; 参考链接&#xff1a;https://blog.csdn.n…

Android Logcat 命令行工具

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、日常用法3.1 面板介绍3.2 日志过滤…

获取dom元素

<button type"button" click"greet">count is {{ count }}</button>function greet(event) {if (event) {console.log(event)console.log(event.target)console.log(event.target.tagName)} } 很明显没传参数&#xff0c;但是获取到了相应的值…

【VUE复习·3】@keyup.xxx 键盘事件触发函数(单按键 or 组合按键触发)

总览 1.keyup.xxx or keydown.xxx 单按键触发 2.组合按键触发 一、keyup.xxx or keydown.xxx 1.用法 在我们使用 keyup.enter 时&#xff0c;那么我们可以这样写&#xff1a; <div><input type"text" placeholder"按下回车键以确定..." keyu…

数据结构---课后习题(第一章)

&#x1f388;数据结构 &#x1f388;☀️☀️第一章 &#x1f388;☀️☀️&#x1f4a1;&#x1f4a1;&#x1f4a1;k阶m项斐波那契数 题目1.17&#xff1a; 已知k阶斐波那契序列的定义为 试编写求k阶斐波那契序列的第m项值的函数算法&#xff0c;k和m均以值调用的形式在函数…

二十,镜面IBL--打印BRDF积分贴图

比起以往&#xff0c;这节应该是最轻松的了&#xff0c; 运行结果如下 代码如下&#xff1a; #include <osg/TextureCubeMap> #include <osg/TexGen> #include <osg/TexEnvCombine> #include <osgUtil/ReflectionMapGenerator> #include <osgDB/Re…

新来个技术总监,把限流实现的那叫一个优雅,佩服!

新来个技术总监&#xff0c;把限流实现的那叫一个优雅&#xff0c;佩服&#xff01; 在电商高并发场景下&#xff0c;我们经常会使用一些常用方法&#xff0c;去应对流量高峰&#xff0c;比如限流、熔断、降级&#xff0c;今天我们聊聊限流。什么是限流呢&#xff1f;限流是限…

RocketMQ高性能核心原理与源码架构剖析

文章目录 1、源码环境搭建1.1、主要功能模块1.2、源码启动服务1.2.1、 启动nameServer1.2.2、 启动Broker1.2.3、 发送消息1.2.4、 消费消息 2、源码剖析2.1、NameServer的启动过程2.2、Broker服务启动过程2.3、Netty服务注册框架2.3.1、关注重点2.3.2、源码重点 1、源码环境搭…

【Linux】多线程

目录 一、线程1.线程概念2.二级页表3.线程的优点4.线程的缺点 二、进程和线程三、线程控制1.POSIX线程库2.线程创建3.线程等待4.线程终止5.线程分离 四、线程ID 一、线程 1.线程概念 什么是线程&#xff1f; 1.在一个程序里的一个执行路线就叫做线程&#xff08;thread&#x…

PS与PL与PG082

参考&#xff08;照抄自己加点&#xff09;&#xff1a; ZYNQ PS-PL数据交互方式总结&#xff08;好文&#xff09;_axi emc-CSDN博客 zynq_process是一个用于方便操作PS和PL通信的GUI。 MIO分配在bank0和bank1直接与PS部分相连&#xff0c;EMIO分配在bank2直接和PL部分…

CSS详细基础(三)复合选择器

前两章介绍了CSS中的基础属性&#xff0c;以及一些基础的选择器&#xff0c;本贴开始介绍复合选择器的内容~ ​ 在 CSS 中&#xff0c;可以根据选择器的类型把选择器分为基础选择器和复合选择器&#xff0c;复合选择器是建立在基础选择器之上&#xff0c;对基本选择器进行组合形…

时序分解 | Matlab实现CEEMD互补集合经验模态分解时间序列信号分解

时序分解 | Matlab实现CEEMD互补集合经验模态分解时间序列信号分解 目录 时序分解 | Matlab实现CEEMD互补集合经验模态分解时间序列信号分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现CEEMD互补集合经验模态分解时间序列信号分解 1.分解效果图 &#xff0…

Leetcode383. 赎金信

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以&#xff0c;返回 true &#xff1b;否则返回 false 。 magazine 中的每…