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

【React】react-router 路由详解

🚩🚩🚩
💎个人主页: 阿选不出来
💨💨💨
💎个人简介: 一名大二在校生,学习方向前端,不定时更新自己学习道路上的一些笔记.
💨💨💨
💎目前开发的专栏: JS 🍭Vue🍭React🍭
💨💨💨

【React】react-router 路由详解

    • 1.什么是路由
    • 2.路由安装
    • 3.路由使用
      • 基本使用
      • NavLink的使用
      • Switch的使用
      • redirect重定向
      • 向路由组件传参的三种方式
      • 声明式导航与编程式导航
      • WithRouter
    • 4.反向代理
    • 5.cssModule

1.什么是路由

前端路由就是把不同路由对应不同的内容或页面的任务交给前端来做,根据不同的url地址展示不同的内容或页面。

一个针对React而设计的路由解决方案、可以友好的帮你解决React Components 到 URL 之间的同步映射关系。

2.路由安装

npm install react-router-dom@5

react-router-dom 的理解

  1. react 的一个插件库。
  2. 专门用来实现一个SPA应用。
  3. 基于react 的项目基本都会用到此库。

react-router-dom相关API

内置组件

<BrowserRouter> /<HashRouter>/ <Route> /<Link>/ <Switch>

其他

history 对象 / match 对象 / withRouter函数

3.路由使用

基本使用

路由方法导入

import { Link,Route } from 'react-router-dom'

路由链接

<link to="/home">About</link>

to属性的值表示要跳转的路由,react中link就相当于 a 标签。

注册路由

import Home from '...'
...
<Route path="/home" component={Home}></Route>

path属性的值表示 Route 匹配的路由,component属性的值表示与这个路由路径相匹配的组件。

注意: <Link/>标签和 <Route/>标签必须要在 Router的内部写入才生效,且 <Link/> 标签和 <Route/>标签在同一个 Router中。

这里的 Router有两种形式:BrowserRouter HashRouter

BrowserRouter与HashRouter的区别

  1. 底层原理不一样:

    1. BrowserRouter使用的是H5的history API,不兼容IE9及以下的版本。
    2. HashRouter使用的是URL哈希值。
  2. path表现形式不一样:

    1. BrowserRouter的路径中没有#,例如:location:3000/demo/test
    2. HashRouter的路径包含#,例如:location:3000/#/demo/test
  3. 刷新后对路由state参数的影响:

​ (1). BrowserRouter没有任何影响,因为state保留在history对象中。

​ (2). HashRouter刷新后会导致state参数的丢失!

4.备注:HashRouter可以用于解决一些路径错误相关的问题。

NavLink的使用

在项目开发中,我们经常遇到 路由切换显示高亮的效果。

如图:在这里插入图片描述

Navlink的作用与上文提到的 <Link>一样,只是又另外提供了一个 activeClassName属性,activeClassName属性指定选中路由的a链接的样式。

import {NavLink} from 'react-router-dom'
<NavLink activeClassName="atguigu">About</NavLink>

Switch的使用

Switch可以提高路由匹配效率(单一匹配)。

路由默认情况下使用的是模糊匹配。比如:

<Route path="/home" component={Home}/>
<Route path="/home/detail" component={Detail}/>

在路由的模糊匹配下,当进入‘xxx/home/detail’这个网址时,路由能同时匹配到 ‘/home’ 和 '/home/detail’两个路由,那么页面上将会同时出现 Home 和 Detail 两个组件的内容。

为了避免这种情况的发生,我们需要把路由写入标签内,作用是:当路由匹配到一个 path 后,就不再继续向下匹配了。

<Switch><Route path="/home" component={Home}/><Route path="/home/detail" component={Detail}/>
</Switch>

另一种解决办法就是修改 <Route/> 的匹配模式为严格模式

严格模式

<Route path="/home" component={Home} exact>

exact精确匹配{Redirect}即使使用了exact,外面还要嵌套<Switch/>来用。

注意:

严格匹配不要随便开启,有需要再开,因为有时候开启会导致无法继续匹配二级路由。

redirect重定向

	<Route exact path="/" component={Home}></Route><Route path="/about" component={About}></Route><Route path="/news" component={News}></Route><Redirect from="/" to="/about"></Redirect><Redirect from="/*" to="/login"></Redirect>

1.当用户访问某个页面的时候, 该页面并不存在,此时需要Redirect 重定向, 重新跳到一个我们一个自定义的组件里边。

<Redirect from="/*" to="/login"></Redirect>

2.如果进入到首页面,首页需要默认展示一些东西(数据)。此时path=‘/’,如果什么路由组件都没有匹配到, 就需要Redirect重定向,跳转到要展示的页面。

<Redirect from="/" to="/about"></Redirect>

<Redirect/> 写在<Switch/>标签内,所有的<Route/>路由之后。

向路由组件传参的三种方式

路由组件与一般组件的区别

  1. 写法不同

​ 一般组件:<Demo/>

​ 路由组件:<Route path="/demo" component={Demo}/>

  1. 通常存放位置不同

​ 一般组件: components文件夹下

​ 路由组件: pages文件夹下

3.接收到的props不同:

​ 一般组件:组件标签内写了什么属性,就能收到什么。

​ 路由组件:接收到三个固定的属性

history:{...go: f go(n)goBack: f goBack()goForward: f goForward()push: f push(path,state)replace: f replace(path,state)
}location:{...pathname:'/xxx',search:"",   state:undefined
},
match:{...params: {}path: '/xxx'url: '/xxx'
}     

1.params参数

路由链接携带参数:

<link to="/demo/test/Tom/18">详情</link>

注册路由:

<Route path="/demo/test/:name/:age" component={Test}/>

路由组件接收参数:

const {name,age} = this.props.match.params

2.search参数

路由链接携带参数:

<link to="/demo/test?name=Tom&age=18">详情</link>

注册路由:

<Route path="/demo/test" component={Test}/>

路由组件接收参数:

const {search} = this.props.location

此时 search=‘?name=Tom&age=18’

需要借助querystring, 将获取到的search解析为一个对象。

import qs from 'querystring'qs.parse(search.slice(1))

3.state参数

路由链接携带参数:

<link to={{path:"demo/test",state:{name:'Tom',age18}}}>详情</link>

注册路由:

<Route path="/demo/test" component={Test}/>

路由组件接收参数:

const {name,age} = this.props.location.state

前两种传参方式,传递的参数在path上有所体现,参数随path的改变而改变。

state传参方式在 BrowserRouter下,只要不清除浏览器缓存,即使页面刷新也可以保留住参数,因为location对象是histoty对象的一部分,也就是说state保存在history中。当使用HashRouter时,页面刷新会造成参数丢失,因为 hashRouter中没有history对象来保存state。

声明式导航与编程式导航

push()

params传参

<Link to={/home/message/detail/${msgobj.id}/${msgobj.title}}>
{msgobj.title}</Link>
this.props.history.push(`/home/message/detail/${id}/${title}`)

search参数

<Link to={/home/message/detail/?id=${msgobj.id}&title=${msgobj.title}}>
{msgobj.title}</Link>
this.props.history.push(`/home/message/detail?id=${id}&title=${title}`)

state传参

 <Link to={{`​          `pathname:'/home/message/detail',`​          `state:{id:msgobj.id,title:msgobj.title}`​         `}}>{msgobj.title}</Link>
this.props.history.push(`/home/message/detail`,{id,title})

replace()同理

this.props.history.goBack()后退

this.props.history.goForward()前进

this.props.history.go(num)前进(后退)num步

WithRouter

可以加工一般组件,让一般组件具备路由组件所特有的API。

import { withRouter } from 'react-router-dom'
...
class Header extends Component {...
}
export default withRouter(Header)

WithRouter 返回值是一个新组件。

4.反向代理

安装包

npm install http-proxy-middleware --save

配置文件

在src根目录新建 setupProxy 文件,写入如下代码:

const {createProxyMiddleware} = require('http-proxy-middleware')module.exports = function(app){app.use("/ajax", //我们可以在这里设置个口令  createProxyMiddleware({target:'http://i.maoyan.com', //target是api服务器地址 changeOrigin: true, //这个是是否替换这里一定要写true  // 去掉我们添加的前缀,保证我们传递给后端的接口是正常的pathRewrite: { "^/api": '' } //这是个正则匹配}));
};

5.cssModule

场景:由于各个组件内引用的css文件,最终会合并在 /public/index.html的

修改css文件名并引入css文件

import style from'./css/Film.module.css'

只要引入的css文件不同,即使在不同的组件中使用相同的类名如 style.bigbox,最终形成的类名仍不相同。

<div className={style.bigbox}></div>

在这里插入图片描述

相关文章:

【React】react-router 路由详解

&#x1f6a9;&#x1f6a9;&#x1f6a9; &#x1f48e;个人主页: 阿选不出来 &#x1f4a8;&#x1f4a8;&#x1f4a8; &#x1f48e;个人简介: 一名大二在校生,学习方向前端,不定时更新自己学习道路上的一些笔记. &#x1f4a8;&#x1f4a8;&#x1f4a8; &#x1f48e;目…...

DaVinci 偏好设置:系统 - 内存和 GPU

偏好设置 - 系统/内存和 GPUPreferences - System/Memory and GPU内存和 GPU Memory and GPU 选项卡提供了内存配置以及 GPU 配置的相关设置。内存配置Memory Configuration系统内存System Memory列出了所用电脑的总的可用内存。限制 Resolve 内存使用到Limit Resolve memory u…...

视频知识点(22)- 教你认清楚YUV420P和YUV420SP的真正差异在哪里

*《音视频开发》系列-总览* 前言 在视频技术领域,存在着非常多的颜色空间模型,YUV颜色空间就是其中之一。我们没有必要把所有的颜色空间都搞明白,只需要关注自己所从事的领域的常用颜色空间模型即可,同样,YUV颜色空间模型也有非常多的子类型,我们也没有必要都搞得清清楚楚…...

企业电子招标采购系统源码Spring Cloud + Spring Boot + MybatisPlus + Redis + Layui

项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以及…...

面试常问-Alpha测试和Beta测试

Alpha测试 Alpha测试是一种验收测试&#xff0c;在识别典型用户可能执行的任务并对其进行测试之前&#xff0c;执行该测试是为了识别所有可能的问题和错误。 尽可能简单地说&#xff0c;这种测试之所以被称为alpha&#xff0c;只是因为它是在软件开发的早期、接近开发结束时和…...

html理论基础

组织&#xff1a;中国互动出版网&#xff08;http://www.china-pub.com/&#xff09;RFC文档中文翻译计划&#xff08;http://www.china-pub.com/compters/emook/aboutemook.htm&#xff09;E-mail&#xff1a;ouyangchina-pub.com译者&#xff1a;黄俊&#xff08;hujiao hj_c…...

【安卓开发】数据存储全方案--详解持久化技术

读书笔记系列&#xff1a;第一行代码 Android 6.1 持久化技术简介 三种数据持久化方式&#xff1a;文件存储、SharedPreference存储以及数据库存储&#xff0c;除此之外还可以存储在SD卡中&#xff08;不安全&#xff09; 6.2 文件存储 该方法不对存储的内容做格式化处理都…...

Vue项目实战

一、产品开发的大致流程 一般公司流程如下&#xff1a; 1、产品经理设计产品原型图 2、UI设计师设计符合需求的原型UI图 3、前端100%还原高保真UI设计图 4、后端设计接口 5、前后端接口联调 6、前后端功能自测 7、测试、运维进行产品的测试和上线 一般大型公司流程如下&…...

Github 学生优惠包 -- 最新防踩坑指南

Github学生优惠包的申请最近越来越麻烦&#xff0c;里面有非常多的坑&#xff0c;留下此文防止各位申请的时候踩到。 此文面向中国大陆真正有学生身份的同学&#xff01;&#xff01;&#xff01; 文章目录前言1.用到的网址2.申请所需3.详细步骤4.踩坑点前言 记得在一年以前还…...

2023年美国大学生数学建模A题:受干旱影响的植物群落建模详解+模型代码(二)

前言 资源放CSDN上面过不了审核,都快结束了都没过审真的麻了,订阅专栏的同学直接加我微信直接发你。我只打造优质专栏。专注建模四年,博主参与过大大小小数十来次数学建模,理解各类模型原理以及每种模型的建模流程和各类题目分析方法。此专栏的目的就是为了让零基础快速使…...

第47章 后端管理首页与Axios拦截守卫原理

1 404全局拦截 1.1 定义布局页&#xff1a;src\views\ 404View.vue <template> <el-container> <el-main> </el-main> <el-footer> <h1>大人&#xff0c;你要找的页面离家出走了&#xff01;小的正在努力寻找中…</h1> </el-fo…...

【前端】小程序开发入门:安装开发工具、目录结构与项目配置

文章目录前期准备目录结构app.jsonpageswindow其他前期准备 开发小程序要先申请一个对应的AppID&#xff1a;微信小程序 (qq.com) 微信官方小程序开发文档&#xff1a;微信开放文档 (qq.com) 然后安装一个小程序开发工具&#xff1a; 选择稳定版&#xff1a; 安装后打开&…...

Java反序列化漏洞——CommonsBeanutils1链分析

一、了解Apache Commons BeanutilsApache Commons Beanutils 是 Apache Commons 工具集下的另一个项目&#xff0c;它提供了对普通Java类对象&#xff08;也称为JavaBean&#xff09;的一些操作方法。在Java中&#xff0c;有很多class的定义都符合这样的规范若干private实例字段…...

三菱PLC的MC协议配置说明

三菱PLC的MC协议配置说明先说一下弱智的踩坑记录详细配置过程1、三菱Q02H CPUQJ71E71-100以太网模块设置MC协议1.1 PLC编程线连接与编程线驱动安装1.2 PLC通讯测试1.3 PLC MC协议设置1.4 PLC断点重启1.5 网络调试助手测试2、三菱Q03UDE CPU内置以太网设置MC协议2.1 PLC编程线连…...

Python基础复习总结

文章目录Python基础复习Python的下载与安装标识符关键字模块条件、循环语句if elif elsefor循环while循环成员测试Python中的数据类型序列列表 list元组 tuple集合 set字典 dictPython关系运算算术运算符比较运算符逻辑运算符位运算符赋值运算符运算符优先级字符串表示字符串字…...

【Linux操作系统】【综合实验五 网络管理与通信】

文章目录一、实验目的二、实验要求三、实验内容四、实验报告要求一、实验目的 要求了解和熟悉Linux网络客户/服务器管理模式&#xff08;client/server&#xff09;与网络环境的配置&#xff1b;熟悉网络远程登录模式与TCP/IP常见终端命令的使用&#xff1b;学会使用在线通信与…...

Qt下实现不规则形状窗口显示

文章目录前言一、资源文件的添加二、初始化窗口三、重写paintEvent函数实现窗口重绘四、重写QMouseEvent相关函数实现不规则窗口的移动及关闭五、demo完整代码六、下载链接总结前言 本文实现了Qt下显示两个不规则形状的窗口demo&#xff0c;其中有Qt的窗口对话框和QPaintEvent…...

使用ribbon实现负载均衡

1.新建两个provider&#xff1a;springcloud-provider-dept-8002 2. 配置跟8001一样 整合 Ribbon 由上述可知&#xff0c;Ribbon 是需要集成在消费端的 所以在消费端 &#xff1a; springcloud-03-consumer-dept-8082 进行修改 在 POM 文件中添加 Ribbon、Eureka 依赖 <!--…...

从页面仔到工程师,前端到底在发挥什么价值

玉伯在前端圈子里摸爬滚打十几年&#xff0c;他对前端价值的理解是什么样的&#xff1f;在他眼里&#xff0c;前端到底是一个怎样的岗位&#xff1f;我们带着这样的问题向他提问。支付宝体验技术部是前端同学最希望加入的团队之一&#xff0c;玉伯带领这个团队做出诸多创新产品…...

Java程序员进阶宝典,让你学习面试无忧!

心净则明,心诚则灵如果你想要一个月速成程序员&#xff0c;那么这篇文章不适合&#xff0c;如果你仅想要在IT圈“耍酷”&#xff0c;那你也不需要研读&#xff0c;如果你执着询问“退化”成为一名程序猿有啥捷径&#xff0c;那我只能告诉你&#xff0c;此路不通&#xff01;不可…...

Hadoop HDFS的主要架构与读写文件

一、Hadoop HDFS的架构 HDFS&#xff1a;Hadoop Distributed File System&#xff0c;分布式文件系统 &#xff11;&#xff0c;NameNode 存储文件的metadata&#xff0c;运行时所有数据都保存到内存&#xff0c;整个HDFS可存储的文件数受限于NameNode的内存大小一个Block在…...

面试题练习第五篇

面试题第五篇1. 说说React生命周期中有哪些坑&#xff1f;如何避免&#xff1f;2. 说说Real diff算法是怎么运作的&#xff1f;3. 调和阶段setState干了什么&#xff1f;4. 说说redux的实现原理是什么&#xff0c;写出核心代码&#xff1f;5. React合成事件的原理&#xff1f;6…...

hadoop02【尚硅谷】

HDFS 大数据学习笔记 一、HDFS产出背景及定义 HDFS产生背景 随着数据量越来越大&#xff0c;在一个操作系统存不下所有的数据&#xff0c;那么就分配到更多的操作系统管理的磁盘中&#xff0c;但是不方便管理和维护&#xff0c;迫切需要一种系统来管理多台机器上的文件&#x…...

Alist ——本地网盘管理器

Alist ——本地网盘管理器 一、下载工具 Alist https://github.com/alist-org/alist二、启动登录 进入下载好的文件中&#xff0c;在地址栏输入cmd进入命令行启动 进入命令行输入 alist start启动 记住密码&#xff0c;和端口进入浏览器 输入 &#xff1a;127.0.0.1:5244用…...

【白话科普】聊聊网络架构变革的关键——SDN

最近二狗子在网上冲浪的时候&#xff0c;不小心将 CDN 搜索成了 SDN&#xff0c;结果跳出来了一大堆相关的知识点。 好学的二狗子当然不会随随便便糊弄过去&#xff0c;于是认认真真学习了好久&#xff0c;终于了解了 SDN 是什么。 原来&#xff0c;SDN 的全称是 Software De…...

go gin学习记录4

环境 环境&#xff1a;mac m1&#xff0c;go version 1.17.2&#xff0c; goland&#xff0c; mysql 除了原生sql&#xff0c;和orm操作之外&#xff0c;go还有一类包&#xff0c;只用于生成sql&#xff0c;典型的如sqlbuilder&#xff0c;今天就来研究一下它。 安装sqlbuil…...

家政服务小程序实战开发教程015-填充用户信息

我们上一篇讲解了立即预约功能&#xff0c;存在的问题是&#xff0c;每次都需要用户填写联系信息。在我们前述篇章中已经介绍了用户注册的功能&#xff0c;在立即预约的时候我们需要把已经填写的用户信息提取出来&#xff0c;显示到表单对应的字段中。本篇我们就讲解一下如何提…...

python+selenium使用webdriver启动chrome出现闪退现象解决

这两天发现之前开发的爬虫程序出问题了&#xff1a;谷歌浏览器出现打开立即闪退的现象&#xff0c;代码未修改过&#xff0c;检查也没有任何问题&#xff01; 查看chrome浏览器发现版本更新了 ↑&#xff08;点击chrome浏览器右上角三个点&#xff0c;最下面帮助→Google Chr…...

新建idea项目

目录IDEA系列之创建各种项目 https://blog.csdn.net/LOVEQD123/article/details/105886077 idea 创建项目的三种方式 https://blog.csdn.net/weixin_50034122/article/details/118754521 创建空项目 https://blog.csdn.net/qq_44537956/article/details/123075134 创建 spri…...

Django框架之类视图

类视图 思考&#xff1a;一个视图&#xff0c;是否可以处理两种逻辑&#xff1f;比如get和post请求逻辑。 如何在一个视图中处理get和post请求 注册视图处理get和post请求 以函数的方式定义的视图称为函数视图&#xff0c;函数视图便于理解。但是遇到一个视图对应的路径提供…...

如何做自己公司网站/wix网站制作

Java正则表达式应用总结一、概述正则表达式是Java处理字符串、文本的重要工具。Java对正则表达式的处理集中在以下两个两个类&#xff1a;java.util.regex.Matcher 模式类&#xff1a;用来表示一个编译过的正则表达式。java.util.regex.Pattern 匹配类&#xff1a;用模式匹…...

网络营销自己做网站/海南乐秀同城群软件下载

钢结构深化设计的出路在哪里&#xff1f;前几天&#xff0c;一起和几个做了10多年的深化设计朋友聊天&#xff0c;提到深化设计这个行业的附加值&#xff0c;也聊到这个行业现状、出路。【现状】1.建模&#xff1a;三维建模大部分都是tekla&#xff0c;辅助CAD&#xff0c;也有…...

做包装找灵感看什么网站/成都达洱狐网络科技有限公司

上一篇“记录一次基于vue、typescript、pwa的项目由开发到部署”&#xff0c;发布后&#xff0c;忙于秋招的楼主我&#xff0c;终于有时间来写这篇文章。最近秋招也挺顺利&#xff0c;拿到了网易广州岗的offer&#xff0c;对目前想留在广州发展的我来说真是太合适不过了。在最近…...

织梦做的网站后台怎么进/实体店怎么引流推广

最近做城市天气相关的项目&#xff0c;找到一些资源给大家分享一下。 <?xml version"1.0" encoding"UTF-8"?><China><province id"01" name"北京"><city id"0101" name"北京"><cou…...

地宝网 网站建设/什么是seo关键词

原文:WPF下的视频录制界面设计 在去年12月份&#xff0c;我曾经写过三篇文章讨论C#下视频录制、播放界面的设计。这三篇文章是&#xff1a;利用C&#xff03;画视频录制及播放的界面&#xff08;一&#xff09; 利用C&#xff03;画视频录制及播放的界面&#xff08;二&#xf…...

网站怎么做才能上百度首页/友情链接联盟

Hibernate中进行数据库增删改的代码&#xff0c;太多不想背了&#xff0c;记在这里以后来查好啦~~~~packageorg.lxh.hibernate.demo01;importjava.util.Iterator;importjava.util.List;importorg.hibernate.Query;importorg.hibernate.Session;importorg.hibernate.SessionFact…...