当前位置: 首页 > news >正文

React入门 9:React Router

1. 什么是路由

路由routing)就是通过互联的网络把信息从源地址传输到目的地址的活动。

以上是中文维基百科对路由的解释。通俗的来讲,把一个地方的信息传输到他想去的目的地的过程,就叫路由。

2. 用代码解释路由

需求:页面上有2个按钮,分别是登陆和注册,点击登陆按钮,就切换到对应的登陆界面,点击注册按钮,就切换到对应的注册界面。

示例代码:

function Box1(){return <div className="box">登陆</div>
}function Box2(){return <div className="box">注册</div>
}function App() {let [n, setN] = useState(0)return (<div className="App"><div><button onClick={()=> setN(0)}>登陆</button><button onClick={()=> setN(1)}>注册</button></div><div>{ n % 2 === 0 ? <Box1 />:<Box2 />}</div></div>);
}const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

这个其实就是路由的雏形了,每个页面对应着一个组件,然后在不同状态下去切换 。

3. 新增的需求

提出需求:在分享该页面出去时,用户直接到达注册页面。(以上示例代码的首页是登陆界面)

3.1 修改 url 中的 hash

url 中 #(hash) 的含义
URL 的 hash 部分,指的是 # 后的部分
window.location.hash 可读取或写入 hash

function Box1() {return <div className="box">登录</div>;
}function Box2() {return <div className="box">注册</div>;
}function App() {//获取当前的hash值let hash = window.location.hash;let initUI = hash === "#signup" ? "注册" : "登录";let [ui, setUI] = useState(initUI);//切换页面时,改hashlet onClickLogin = () => {setUI("登录");window.location.hash = "login";};let onClickSignUp = () => {setUI("注册");window.location.hash = "signup";};return (<div className="App"><div><button onClick={onClickLogin}>登录</button><button onClick={onClickSignUp}>注册</button></div><div>{ui === "登录" ? <Box1 /> : <Box2 />}</div></div>);
}

#signup : 注册, 空或 #login: 登录。
不同的界面对应不同的字符串(hash),把用户送往其想到达的目的地,就是路由。

3.2 除了 hash 还能用什么

但是,地址栏上有这个 “#” 符号不太好看,能不能变好看点?

  • 直接修改 pathname ,但会刷新页面
不用
window.location.hash = "login";
而用
window.location.pathname = "/login";

我只是想切换个tab,页面就整个刷新了啊

  • 使用 window.history.pushState()
    可以不刷新页面而改变 pathname
window.history.pushState(null, '', '/login')
function App() {let path = window.location.pathname;let initUI = path === "/signup" ? "注册" : "登录";console.log(initUI);let [ui, setUI] = useState(initUI);let onClickLogin = () => {setUI("登录");window.history.pushState(null, "", "/login");};let onClickSignUp = () => {setUI("注册");window.history.pushState(null, "", "/signup");};return (<div className="App"><div><button onClick={onClickLogin}>登录</button><button onClick={onClickSignUp}>注册</button></div><div>{ui === "登录" ? <Box1 /> : <Box2 />}</div></div>);
}
3.3 三种方式的区别
  • window.location.hash (保险办法)
    可让 url 变化,同时不刷新页面
  • window.location.pathname
    会刷新页面,别用
  • window.history.pushState( , , ) (想好看用这个)
    不刷新页面,并改变 pathname
    建议:只有后端将所有路径都指向首页时,才使用这个API。

4. React Router

上面的代码存在着重大缺陷:

  • 如果 path 过多,代码就要写很多 if ... else
  • 路由有无限个,无法写

暂不考虑使用正则表达式。使用 React Router 来解决这些问题吧 : )
React Router,保持 UI 和 URL同步。

4.1 安装 React Router

使用命令行:

npm install react-router-dom

注意:
react-router: 实现了路由的核心功能。
react-router-dom: 基于react-router,加入了在浏览器运行环境下的一些功能。
写网站的时候一般引入 react-router-dom 就可以了

4.2 使用 React Router

建议查看的官网:react-router

import { BrowserRouter as Router, Switch, Link, Route } from "react-router-dom";function Home(){return <div className="box">首页</div>
}
function Login(){return <div className="box">登录</div>
}
function SignUp(){return <div className="box">注册</div>
}function App(){return(<div className="app"><Router><div className="nav"><Link to="/" className="link">首页</Link> | <Link to="/login" className="link">登录</Link> | <Link to="/signup" className="link">注册</Link></div><Switch><Route exact path="/"> <Home /></Route><Route path="/login"><Login /></Route><Route path="/signup"><SignUp /></Route></Switch></Router></div>)
}ReactDOM.render(<App />, document.getElementById('root'));


喜欢的朋友记得点赞、收藏、关注哦!!!

相关文章:

React入门 9:React Router

1. 什么是路由 路由&#xff08;routing&#xff09;就是通过互联的网络把信息从源地址传输到目的地址的活动。 以上是中文维基百科对路由的解释。通俗的来讲&#xff0c;把一个地方的信息传输到他想去的目的地的过程&#xff0c;就叫路由。 2. 用代码解释路由 需求&#xff1a…...

MATLAB基础应用精讲-【数模应用】Bland-Altman图(附python和R语言代码实现)

目录 前言 几个高频面试题目 Bland-altman图:如何改变y轴 算法原理 Bland-Altman一致性分析 一致性界限 1. 背景介绍 2. Bland-Altman 法 3. batplot 命令介绍 4. 应用实例 Prism GraphPad实现Bland-Altman图 1.输入数据 2.从数据表中选择Bland-Altman分析 3.检…...

ARM/Linux嵌入式面经(四一):中兴面经

1. 请介绍一下您在嵌入式系统开发中的项目经验。 在嵌入式系统开发领域,我积累了丰富的项目经验,这些经验不仅锻炼了我的技术能力,也让我对嵌入式系统的设计和实现有了更深入的理解。以下是我参与的一个具有代表性的嵌入式系统开发项目的详细介绍: 项目背景 该项目是为一…...

鸿蒙虚拟运行环境

加一个环境变量&#xff1a;%SystemRoot%\System32\Wbem pushd "%~dp0" dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt for /f %%i in (findstr /i . hyper-v.txt 2^>nul) do dism /online /norestart /add-package:"%SystemRoot%…...

SpringCloud-Consul

为什么引入 Consul 简介以及安装 控制台 localhost:8500 服务注册与发现 服务端 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId><exclusions><exclusio…...

nginx搭建负载均衡

准备工作 两台虚拟机&#xff0c;或者本地启动两个相同应用&#xff0c;在不同的端口上安装好的nginx&#xff0c;在linux上两个版本的hexo&#xff0c;或者其他应用&#xff0c;方便观察是否进行了负载均衡 启动服务 在两台虚拟机上启动项目&#xff0c;这里以hexo为例 服务器…...

灵当CRM data/pdf.php 任意文件读取漏洞复现

0x01 产品简介 灵当CRM是一款专为中小企业打造的智能客户关系管理工具,由上海灵当信息科技有限公司开发并运营。广泛应用于金融、教育、医疗、IT服务、房地产等多个行业领域,帮助企业实现客户个性化管理需求,提升企业竞争力。无论是新客户开拓、老客户维护,还是销售过程管…...

Python 批量转换 Shapefile 为 GeoJSON

批量转换 Shapefile (.shp) 为 GeoJSON 文件的脚本详解 &#x1f5fa;️&#x1f504; 在地理信息系统&#xff08;GIS&#xff09;和遥感领域&#xff0c;Shapefile&#xff08;.shp&#xff09;格式与GeoJSON格式是两种常用的数据格式。Shapefile 作为矢量数据的标准格式之一…...

软考《信息系统运行管理员》- 4.1信息系统软件运维概述

4.1信息系统软件运维概述 文章目录 4.1信息系统软件运维概述信息系统软件运维的概念信息系统软件的可维护性及维护类型对软件可维护性的度量可以从以下几个方面进行&#xff1a;软件维护分类&#xff1a; 信息系统软件运维的体系1.**需求驱动**2.**运维流程**3.**运维过程**4.*…...

Leetcode 3319. K-th Largest Perfect Subtree Size in Binary Tree

Leetcode 3319. K-th Largest Perfect Subtree Size in Binary Tree 1. 解题思路2. 代码实现 题目链接&#xff1a;3319. K-th Largest Perfect Subtree Size in Binary Tree 1. 解题思路 这一题其实就是一个很常见的树的遍历&#xff0c;我们自底向上遍历每一个子树&#x…...

从秒级到小时级:TikTok等发布首篇面向长视频理解的多模态大语言模型全面综述

文章链接&#xff1a;https://arxiv.org/pdf/2409.18938 亮点直击 追踪并总结从图像理解到长视频理解的MM-LLMs的进展;回顾了各种视觉理解任务之间的差异&#xff0c;并强调了长视频理解中的挑战&#xff0c;包括更细粒度的时空细节、动态事件和长期依赖性;详细总结了MM-LLMs在…...

【CTF】敏感信息泄露 GIT SVN VIM

在CTF&#xff08;Capture The Flag&#xff09;比赛中&#xff0c;信息泄露是常见的考察方向之一。这类题目通过模拟开发人员的疏忽或系统配置的失误&#xff0c;导致敏感文件或数据被泄露。信息泄露题目通常相对简单&#xff0c;但能帮助参赛者掌握如何从公开的信息中获取潜在…...

EMQX服务器的搭建,实现本地机和虚拟机之间的MQTT通信(详细教程)

前言 MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的&#xff0c;这些特点使它适用范围非常广泛。 MQTT协议中有三种身份&#xff1a;发布者&#xff08;Publish&#xff09;、代理&#xff08;Broker&#xff09;&#xff08;…...

cordova的使用

环境 Cordova 是一个跨平台的开发框架&#xff0c;它允许开发者使用 HTML、CSS 和 JavaScript 创建移动应用。Cordova 的不同版本可能会有不同的环境要求。以下是 Cordova 10 和 Cordova 12 在开发 Android 和 iOS 应用时的环境要求的对比总结。 1. Cordova 10 环境要求 And…...

三种Transformer模型中的注意力机制介绍及Pytorch实现:从自注意力到因果自注意力

本文深入探讨Transformer模型中三种关键的注意力机制&#xff1a;自注意力、交叉注意力和因果自注意力。这些机制是GPT-4、Llama等大型语言模型&#xff08;LLMs&#xff09;的核心组件。通过理解这些注意力机制&#xff0c;我们可以更好地把握这些模型的工作原理和应用潜力。 …...

《使用Gin框架构建分布式应用》阅读笔记:p20-p31

《用Gin框架构建分布式应用》学习第2天&#xff0c;p20-p31总结&#xff0c;总计12页。 一、技术总结 1.第一个gin程序 // main.go package mainimport "github.com/gin-gonic/gin"func main() {r : gin.Default()r.GET("/", func(c *gin.Context) {c.J…...

如何修改MacOS的终端的配色和linux一样

目录 一、配色方案 二、修改配色 一、配色方案 一键更改MacOS的终端配色文件&#xff0c;目的就是为了让他从原本的样子变成XShell里面显示的配色样式。文件夹为蓝色&#xff0c;链接文件为青色&#xff0c;可执行文件为绿色之类的。 linux默认配色方案是"exfxcxdxbxege…...

基于百度智能体开发爱情三十六计

基于百度智能体开发爱情三十六计 文章目录 基于百度智能体开发爱情三十六计1. 爱情三十六计智能体2. 三十六计开发创意3. 智能体开发实践3.1 基础配置3.2 进阶配置3.3 调优心得3.4可能会遇到的问题 4. 为什么选择文心智能体平台 1. 爱情三十六计智能体 爱情三十六计 是一款基于…...

计算机网络:计算机网络概述 —— 描述计算机网络的参数

文章目录 数据量性能指标速率带宽数据传输速率 吞吐量时延分析时延问题 时延带宽积往返时间利用率丢包率丢包的情况 抖动可用性可靠性安全性 计算机网络是现代信息社会的基础设施&#xff0c;其性能和可靠性对各类应用至关重要。为了理解和优化计算机网络&#xff0c;我们需要深…...

Windows 11系统选项卡详解:从新手到专家的操作指南

Windows 11的“系统”选项卡是管理电脑硬件和软件设置的中心。 基础操作 1. 查看和编辑系统信息 打开“开始”菜单&#xff0c;点击“设置”图标。 在“设置”窗口中&#xff0c;选择左侧的“系统”选项卡。 点击“关于”。 在这里&#xff0c;我们可以查看系统规格。要编辑设…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...