【React】react-router 路由详解

news2025/4/7 20:56:22

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

在这里插入图片描述

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

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

相关文章

力扣-查找重复的电子邮箱

大家好&#xff0c;我是空空star&#xff0c;本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目&#xff1a;182. 查找重复的电子邮箱二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行结果总结…

物联网对供应链管理的影响

物联网对于许多行业来说都是一项革命性技术&#xff0c;其应用领域涉及零售、交通、金融、医疗保健和能源等行业。物联网在供应链等流程中已经展示了其深度的潜力。管理、预测和监督应用程序有助于车队运输经理提高配送的运营效率&#xff0c;并增加决策的准确性。如今&#xf…

网络服务与应用

14.1网络服务与应用概述 14.2实验一&#xff1a;FTP 1、实验环境&#xff1a;如图&#xff0c;AR1作为FTP sever、AR2作为FTP client &#xff0c;实现AR1与AR2之间的文件传输。 2、实验拓扑&#xff1a; 3、实验步骤&#xff1a; 步骤1&#xff1a;配置设备ip地址 AR1: …

固定值电阻的检测方法总结

🏡《总目录》 目录 1,概述2,测量方法3,检测方法3.1,读值3.2,测量3.3,排故4,总结1,概述 本文简单总结固定值电阻的测量与检查方法要点和注意事项。 2,测量方法 对于固定值电阻的测量来讲,直接将万用表红黑表笔分别插入到如下图所示的红色和黑色接线端。然后将万用表…

【MySQL】MySQL表的增删改查(进阶)

✨个人主页&#xff1a;bit me&#x1f447; ✨当前专栏&#xff1a;MySQL数据库&#x1f447; ✨算法专栏&#xff1a;算法基础&#x1f447; ✨每日一语&#xff1a;悟已往之不谏&#xff0c;知来者之可追。实迷途其未远&#xff0c;觉今是而昨非。 目 录&#x1f384;一. 数…

黑马点评项目总结(未完待续)

黑马点评项目总结0. 整体架构1. 短信登录模块1.1 基于session&#xff08;1&#xff09;后台发送验证码Code&#xff08;2&#xff09;登录、注册&#xff08;3&#xff09;校验登录状态1.2 基于Redis&#xff08;1&#xff09;后台发送验证码Code&#xff08;2&#xff09;登录…

ur3+robotiq ft sensor+robotiq 2f 140配置rviz仿真环境

ur3robotiq ft sensorrobotiq 2f 140配置rviz仿真环境 搭建环境&#xff1a; ubuntu: 20.04 ros: Nonetic sensor: robotiq_ft300 gripper: robotiq_2f_140_gripper UR: UR3 在安装sensor和gripper之前&#xff0c;先简单配置一下UR机械臂的仿真环境&#xff0c;可参考这篇博…

零入门kubernetes网络实战-16->使用golang给docker环境下某个容器里添加一个额外的网卡

《零入门kubernetes网络实战》视频专栏地址 https://www.ixigua.com/7193641905282875942 本篇文章视频地址(稍后上传) 上一篇文章&#xff0c;我们使用了golang在veth pair链接的网络命名空间里添加了网卡&#xff0c; 本篇文章&#xff0c;我尝试&#xff0c;在docker环境下…

新建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…

百度百科词条怎么做?百度百科词条创建攻略分享

只要是想要将自己宣传出去的企业或是个人&#xff0c;都建议创建属于自己的百度百科词条&#xff0c;因为百度百科词条流量大、权重高、排名靠前&#xff0c;创建百度百科词条可以提高企业或是个人的知名度和口碑。 百度百科词条怎么做&#xff1f;每天都有用户在百度上搜索这…

携手亚马逊云科技,大地量子高精度功率预测系统助力清洁能源消纳提速增效

近年来&#xff0c;我国光伏和风电并网装机容量持续增长&#xff0c;截至2021年底&#xff0c;全国可再生能源装机规模突破10亿千瓦&#xff0c;占总发电装机容量的44.8%。其中&#xff0c;风电装机3.28亿千瓦、光伏发电装机3.06亿千瓦。风光电总装机和新增装机规模多年来位居全…

图解 script 标签中的 async 和 defer 属性

图解 script 标签中的 async 和 defer 属性 我们在工作中经常会碰到 script 标签,一般会有以下三种形式 <script srcxxx></script> <script srcxxx async></script> <script srcxxx defer></script>那么这三种形式的 script 标签有什么区…

java 多线程

1.什么是进程&#xff1f;什么是线程&#xff1f; 进程是:一个应用程序&#xff08;1个进程是一个软件&#xff09;。 线程是&#xff1a;一个进程中的执行场景/执行单元。 注意&#xff1a;一个进程可以启动多个线程。 我们在启动java程序的时候&#xff0c;会先启动JVM&am…

【2】MYSQL数据的导入与导出

文章目录 MYSQL-库(相同库名称)的导入导出MYSQL-库(不同库名称)的导入导出MYSQL-表的导入导出MYSQL-表的指定查询记录导入导出前提: 客户端工具是:SQLyog MYSQL-库(相同库名称)的导入导出 1、选中指定库——右键,选择【将数据库复制到不同的主机/数据库】 2、选中指…

分布式之Raft共识算法分析

写在前面 在分布式之Paxos共识算法分析 一文中我们分析了paxos算法&#xff0c;知道了其包括basic paxos和multi paxos&#xff0c;并了解了multi paxos只是一种分布式共识算法的思想&#xff0c;而非具体算法&#xff0c;但可根据其设计具体的算法&#xff0c;本文就一起来看…

SORT与DeepSORT简介

一、MOT( mutil-object tracking)步骤 在《DEEP LEARNING IN VIDEO MUTIL-OBJECT TEACKING: A SURVEY》这篇基于深度学习多目标跟踪综述中&#xff0c;描绘了MOT问题的四个主要步骤 1.跟定视频原始帧 2.使用目标检测器如Faster-rcnn, YOLO, SSD等进行检测&#xff0c;获取目标…

vue 3.0 Vue Router导航守卫的使用

目录前言&#xff1a;安装路由快速使用1. 创建路由模块2.规定路由模式3.使用路由规则4.声明路由链接和占位符5.重定向路由6.嵌套路由7.路径参数8. 声明式和编程式导航8.1 导航到不同的位置8.2 替换当前位置8.3 路由历史9.导航守卫9.1 全局前置守卫9.2全局路由守卫的语法参数9.3…

初阶C语言——操作符【详解】

文章目录1.算术操作符2.移位操作符2.1 左移操作符2.2 右移操作符3.位操作符按位与按位或按位异或4.赋值操作符复合赋值符5.单目操作符5.1单目操作符介绍6.关系操作符7.逻辑操作符8.条件操作符9.逗号表达式10.下标引用、函数调用和结构成员11表达式求值11.1 隐式类型转换11.2算术…

关于Java的深拷贝和浅拷贝

文章目录1.拷贝的引入1.1引用拷贝1.2对象拷贝2.深拷贝与浅拷贝2.1浅拷贝2.2深拷贝1.拷贝的引入 1.1引用拷贝 创建一个指向对象的引用变量的拷贝 Teacher teacher new Teacher("Taylor",26); Teacher otherteacher teacher; System.out.println(teacher); System…

vim常用命令

vim常用三种模式 命令模式&#xff08;Command mode&#xff09; 插入模式&#xff08;Insert mode&#xff09; 末行模式&#xff08;Last line mode&#xff09; &#xff08;一&#xff09;进入命令模式 vi 或者 vim&#xff08;二&#xff09;命令模式 -> 插入模式 &…