当前位置: 首页 > 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;我们可以查看系统规格。要编辑设…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...