React 路由传参

引言

在上一篇中,我们学习了 React 中使用路由技术,以及如何使用 MyNavLink 去优化使用路由时的代码冗余的情况。

这一节我们继续上一篇 React 路由进行一些补充

1. Switch 解决相同路径问题

首先我们看一段这样的代码

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

这是两个路由组件,在2,3行中,我们同时使用了相同的路径 /about

我们发现它出现了两个 about 组件的内容,那这是为什么呢?

其实是因为,Route 的机制,当匹配上了第一个 /about 组件后,它还会继续向下匹配,因此会出现两个 About 组件,这时我们可以采用 Switch 组件进行包裹

<Switch><Route path="/home" component={Home}></Route><Route path="/about" component={About}></Route><Route path="/about" component={About}></Route>
</Switch>

在使用 Switch 时,我们需要先从 react-router-dom 中暴露出 Switch 组件

这样我们就能成功的解决掉这个问题了

2. 解决二级路由样式丢失的问题

当我们将路径改写成 path="/ljc/about" 这样的形式时,我们会发现当我们强制刷新页面的时候,页面的 CSS 样式消失了。这是因为,我们在引入样式文件时,采取的是相对路径,当我们使用二级路由的时候,会使得请求的路径发生改变,浏览器会向 localhost:3000/ljc 下请求 css 样式资源,这并不是我们想要的,因为我们的样式存放于公共文件下的 CSS 文件夹中。

我们有几种方法,可以解决这个问题

  • 将样式引入的路径改成绝对路径
  • 引入样式文件时不带 .
  • 使用 HashRouter

我们一般采用第一种方式去解决

3. 路由的精准匹配和模糊匹配

路由的匹配有两种形式,一种是精准匹配一种是模糊匹配,React 中默认开启的是模糊匹配

模糊匹配可以理解为,在匹配路由时,只要有匹配到的就好了

精准匹配就是,两者必须相同

我们展示一个模糊匹配的例子

<MyNavLink to = "/home/a/b" >Home</MyNavLink>

这个标签匹配的路由,我们可以拆分成 home a b,将会根据这个先后顺序匹配路由

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

就可以匹配到上面的这个路由,因为它匹配的是 home

当匹配的路由改成下面这样时,就会失败。它会按照第一个来匹配,如果第一个没有匹配上,那就会失败,这里的 a 和 home 没有匹配上,很显然会失败

<Route path="/a" component={Home}/>

当我们开启了精准匹配后,就我们的第一种匹配就不会成功,因为精准匹配需要的是完全一样的值,开启精准匹配采用的是 exact 来实现

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

4. 重定向路由

在我们写好了这些之后,我们会发现,我们需要点击任意一个按钮,才会去匹配一个组件,这并不是我们想要的,我们想要页面一加载上来,默认的就能匹配到一个组件。

这个时候我们就需要时候 Redirecrt 进行默认匹配了。

<Redirect to="/home" />

当我们加上这条语句时,页面找不到指定路径时,就会重定向到 /home 页面下因此当我们请求3000端口时,就会重定向到 /home 这样就能够实现我们想要的效果了

5. 嵌套路由

嵌套路由也就是我们前面有提及的二级路由,但是嵌套路由包括了二级、三级...还有很多级路由,当我们需要在一个路由组件中添加两个组件,一个是头部,一个是内容区

我们将我们的嵌套内容写在相应的组件里面,这个是在 Home 组件的 return 内容

<div><h2>Home组件内容</h2><div><ul className="nav nav-tabs"><li><MyNavLink className="list-group-item" to="/home/news">News</MyNavLink></li><li><MyNavLink className="list-group-item " to="/home/message">Message</MyNavLink></li></ul>{/* 注册路由 */}<Switch><Route path="/home/news" component={News} /><Route path="/home/message" component={Message} /></Switch></div>
</div>

在这里我们需要使用嵌套路由的方式,才能完成匹配

首先我们得 React 中路由得注册是有顺序得,我们在匹配得时候,因为 Home 组件是先注册得,因此在匹配的时候先去找 home 路由,由于是模糊匹配,会成功的匹配

在 Home 组件里面去匹配相应的路由,从而找到 /home/news 进行匹配,因此找到 News 组件,进行匹配渲染

如果开启精确匹配的话,第一步的 /home/news 匹配 /home 就会卡住不动,这个时候就不会显示有用的东西了!

6. 传递 params 参数

首先我们需要实现的效果是,点击消息列表,展示出消息的详细内容

这个案例实现的方法有三种,第一种就是传递 params 参数,由于我们所显示的数据都是从数据集中取出来的,因此我们需要有数据的传输给 Detail 组件

我们首先需要将详细内容的数据列表,保存在 DetailData 中,将消息列表保存在 Message 的 state 中。

我们可以通过将数据拼接在路由地址末尾来实现数据的传递

 <Link to={`/home/message/detail/${msgObj.id}/${msgObj.title}`}>{msgObj.title}</Link>

如上,我们将消息列表的 id 和 title 写在了路由地址后面

这里我们需要注意的是:需要采用模板字符串以及 $ 符的方式来进行数据的获取

在注册路由时,我们可以通过 :数据名 来接收数据

<Route path="/home/message/detail/:id/:title" component={Detail} />

如上,使用了 :id/:title 成功的接收了由 Link 传递过来的 id 和 title 数据

这样我们既成功的实现了路由的跳转,又将需要获取的数据传递给了 Detail 组件

我们在 Detail 组件中打印 this.props 来查看当前接收的数据情况

我们可以发现,我们传递的数据被接收到了对象的 match 属性下的 params 中

因此我们可以在 Detail 组件中获取到又 Message 组件中传递来的 params 数据

并通过 params 数据中的 id 值,在详细内容的数据集中查找出指定 id 的详细内容

const { id, title } = this.props.match.params
const findResult = DetailData.find((detailObj) => {return detailObj.id === id
})

最后渲染数据即可

7. 传递 search 参数

我们还可以采用传递 search 参数的方法来实现

首先我们先确定数据传输的方式

我们先在 Link 中采用 ? 符号的方式来表示后面的为可用数据

<Link to={`/home/message/detail/?id=${msgObj.id}&title=${msgObj.title}`}>{msgObj.title}</Link>

采用 search 传递的方式,无需在 Route 中再次声明,可以在 Detail 组件中直接获取到

我们可以发现,我们的数据保存在了 location 对象下的 search 中,是一种字符串的形式保存的,我们可以引用一个库来进行转化 querystring

import qs from 'querystring'

这个库是 React 中自带有的,它有两个方法,一个是 parse 一个是 stringify

我们可以采用 parse 方法,将字符串转化为键值对形式的对象

const { search } = this.props.location
const { id, title } = qs.parse(search.slice(1))

这样我们就能成功的获取数据,并进行渲染

tips:无需声明接收

8. 传递 state 参数

采用传递 state 参数的方法,是我觉得最完美的一种方法,因为它不会将数据携带到地址栏上,采用内部的状态来维护

<Link to={{ pathname: '/home/message/detail', state: { id: msgObj.id, title: msgObj.title } }}>{msgObj.title}</Link>

首先,我们需要在 Link 中注册跳转时,传递一个路由对象,包括一个 跳转地址名,一个 state 数据,这样我们就可以在 Detail 组件中获取到这个传递的 state 数据

注意:采用这种方式传递,无需声明接收

我们可以在 Detail 组件中的 location 对象下的 state 中取出我们所传递的数据

const { id, title } = this.props.location.state

直接使用即可~

解决清除缓存造成报错的问题,我们可以在获取不到数据的时候用空对象来替代,例如,

const { id, title } = this.props.location.state || {}

当获取不到 state 时,则用空对象代替

这里的 state 和状态里的 state 有所不同

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

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

相关文章

mysql heartbeat lvs_mysql+heartbeat+DRBD+LVS实现mysql高可用二

上一节&#xff0c;讲述了DRBD的安装&#xff0c;因为要利用heartbeatDRBDmysql实现mysql的高可用&#xff0c;所以这一节讲述安装mysql和heartbeat的安装分别在各个节点安装mysql&#xff0c;文本使用的是二进制的安装包mysql-5.5.33-linux2.6-x86_64.tar.gz[rootdrbd1 usr]# …

mysql执行语句后回退_MySQL命令学习笔记(八)

1 安全管理1.1 访问控制MySQL服务器的安全基础是&#xff1a; 用户应该对他们需要的数据具有适当的访问权&#xff0c;既不能多也不能少1.2 管理用户MySQL用户账号和信息存储在名为mysql的MySQL数据库中。获得所有用户账号列表时&#xff0c;可使用以下代码&#xff1a;USE mys…

mysql怎样dao出数据库_mysql怎么导出数据库?

mysql怎么导出数据库&#xff1f;下面本篇文章就来给大家介绍3种mysql导出数据库的方法&#xff0c;希望对你们有所帮助。mysql导出数据库的方法&#xff1a;方法一cmd 到mysql bin目录下用如下命令&#xff1a;mysqldump --opt -h192.168.0.156 -uusername -ppassword --skip-…

mac 安装mysql怎么卸载不干净_CleanMyMac卸载不干净怎么办?如何彻底删除Mac上的CleanMyMac?...

CleanMyMac for mac是非常受欢迎的系统清理、软件卸载软件&#xff0c;但是想要卸载CleanMyMac的有些用户发现不能完全卸载&#xff0c;那么CleanMyMac卸载不干净怎么办&#xff1f;如何彻底删除CleanMyMac&#xff1f;这里带来两种可以彻底删除CleanMyMac的方法&#xff0c;有…

mysql判断是否为null_MySQL如何判断字段是否为null

相信很多用了MySQL很久的人,对这两个字段属性的概念还不是很清楚,一般会有以下疑问: 我字段类型是not null,为什么我可以插入空值 为什么not null的效率比null高 判断字段不为空的时候,到底要 select * from table where column <> 还是要用 select * from table w…

python如何导入自定义模块_【python】导入自定义模块

一、直接import1.当执行文件与要导入的py文件在同一目录下时假设要在wangyi.py中导入weibo.py文件import weibo2.当执行文件与要导入的py文件所在文件夹在同一目录下时假设要在wangyi.py中导入post packaging中的method.py(1)from post_packaging import method(2)from post_pa…

win 10 java 安装_win10---Java安装及环境变量配置

一、Java安装给出的下载地址已经是1.8.0及以上的版本&#xff0c;只需要进去根据操作系统位数选择所对应的包即可&#xff0c;我的是Windows x64&#xff0c;所以我选择的是第二个。注意⚠️&#xff1a;下载jdk时&#xff0c;需要登录Oracle账户&#xff0c;如果没有&#xff…

java 代码块的作用_4种Java代码块的作用讲解

4种Java代码块的作用讲解时间&#xff1a;2017-06-28 来源&#xff1a;华清远见JAVA学院今天华清Java学院小编要和大家分享的是Java代码块的作用&#xff0c;代码块是一种常见的代码形式&#xff0c;他用大括号“{&#xff5d;”将多行代码封装在一起&#xff0c;形成一个独…

java properties用法_java中Properties文件加载和使用方法

一.Properties简介Properties 类继承自HashTable&#xff0c;提供的方法很像Map的实现类HashMap。它在 Java 编程的早期就有了&#xff0c;并且几乎没有什么变化。J2SE 的 Tiger 版本增强了这个类&#xff0c;不仅可以用它在单独一行中指定用等号分隔的多个键-值对(其中键和值是…

java基础知识点_JAVA基础知识

1.注释&#xff0c;关键字&#xff0c;标识符1.注释(1)注释&#xff1a;解释说明程序的而文字。(2)注释的分类&#xff1a;单行注释 格式&#xff1a; //注释的文字多行注释 格式&#xff1a;/*注释的文字*/文档注释 格式&#xff1a;/**注释的文字*/(3)注释的作用&#xff1a;…

python无人机路径规划算法_RRT算法在Python中的实现,快速,拓展,随机,树

"""《基于智能优化与RRT算法的无人机任务规划方法研究》博士论文《基于改进人工势场法的路径规划算法研究》硕士论文"""import matplotlib.pyplot as pltimport randomimport mathimport copyshow_animation Trueclass Node(object):"&quo…

uc3842改可调电源教程_明纬开关电源改可调详细教程

1.拆除启动电阻&#xff0c;电路板是R12R59R58R9 四个150K的电阻。2.拆除原494供电&#xff0c;去掉J22一根跳线&#xff0c;12V辅助电源正极接J22到494一端&#xff0c;负极接地。3.去掉J15更换为20K电阻&#xff0c;同时拆掉变压器下面的ZD1过压保护&#xff0c;输出可达到50…

java webservice ip_通过Web Service实现IP地址查询功能的示例

实例01 实现一个简单的Web服务访问本实例将实现IP地址查询接口服务&#xff0c;根据用户传入的IP地址返回IP所在的省、市、地区&#xff0c;实例中将会用到IP地址库用于查询信息&#xff0c;由于数据较多&#xff0c;所以读者可在光盘资源文件中直接附加数据库文件&#xff0c;…

java五星好评点评器_亲,麻烦给个五星好评!—RatingBar

引言上一篇的CheckBox已经让大家越来越接近实战演练了&#xff0c;本章我们继续分享干货给大家&#xff0c;今天介绍一个实用的UI控件RatingBar(星级评分条)&#xff0c;对于使用过电商APP(某东&#xff0c;某宝等)的小伙伴们来说&#xff0c;应该不会陌生。在对商品进行评价时…

java激光推送ios_关于ios极光推送server端注意的地方

今天试用了极光推送API用它是因为&#xff0c;大多数人说它的文档是最全的&#xff0c;但是用过之后&#xff0c;发现关于IOS的文档&#xff0c;还是很不够&#xff0c;导致走了一点弯路&#xff01;特别是服务端的代码&#xff1a;https://github.com/jpush/jpush-api-java-cl…

日是这一年的等几天Java代码_java中计算指定日期是一年的第几天的方法

Java输入日期计算是这年的第几天&#xff1a;思路通过年份区分出是闰年还是平年&#xff0c;平年 2 月 28 天&#xff0c;闰年 2 月 29 天&#xff1b;1、3、5、7、8、10、12 月份 31 天其余月份均为 30 天&#xff1b;然后将每个月的天数相加即可&#xff0c;注意如果输入的是…

[2021-CVPR] Fine-grained Angular Contrastive Learning with Coarse Labels 论文简析

[2021-CVPR] Fine-grained Angular Contrastive Learning with Coarse Labels 论文简析 论文地址&#xff1a;https://arxiv.org/abs/2012.03515 代码地址&#xff1a;https://github.com/guybuk/ANCOR 首先通俗地介绍一下细粒度&#xff08;fine-grained&#xff09;&#…

[2020-AAAI] Revisiting Image Aesthetic Assessment via Self-Supervised Feature Learning 论文简析

[2020-AAAI] Revisiting Image Aesthetic Assessment via Self-Supervised Feature Learning 论文简析 论文链接&#xff1a;https://arxiv.org/abs/1911.11419 本文探索从自监督的角度进行美学评估。基于一个基本的动机&#xff1a;一个好的美学特征表示应该能够辨别出不同的…

java9 堆外内存_java堆外内存泄漏排查

当考虑Java中的内存泄漏时&#xff0c;我们通常会考虑Java堆泄漏&#xff0c;即在堆中分配的对象没有被垃圾收集。这是我在处理一台服务器内存泄漏时的想法&#xff0c;但我即将经历的远超出我的想象。症状&#xff1a;运行Vertx应用程序(没有交换分区)的生产服务器被Linux内存…

[2020-CVPR] Dynamic Region-Aware Convolution 论文简析

[2020-CVPR] Dynamic Region-Aware Convolution 论文简析 论文地址&#xff1a;https://arxiv.org/abs/2003.12243 参考代码地址&#xff08;非官方&#xff09;&#xff1a;https://github.com/shallowtoil/DRConv-PyTorch 代码笔者自己试了一下&#xff0c;应该是可以的&…