超详细的React路由基础使用

news2024/11/19 8:41:55

目录

基础路由

结构准备

路由的模糊匹配

 嵌套路由

路由传参

声明式路由

路由传递params参数

search(也称query)参数

 state传参

编程式路由导航

withRouter

演示


基础路由

单页应用程序 SPA:
整个应用只有一个完整的页面
点击页面中的链接不会刷新页面,只会做页面的局部更新
数据都需要通过ajax请求获取, 并在前端异步展现。
路由:
  前端路由:
  浏览器端路由,value是component,用于展示页面内容
  注册路由: <Route path="/test" component={Test}>
  工作过程:当浏览器的path变为/test时, 当前路由组件就会变为Test组件
  后端路由:
  理解: value是function, 用来处理客户端提交的请求。
注册路由: router.get(path, function(req, res))
工作过程:当node接收到一个请求时, 根据请求路径和方法找到匹配的路由, 调用路由中的函数来处理请求, 返回响应数据


一个路由就是一个映射关系(key:value)

key为路径, value可能是function或component

  1 明确好界面中的导航区 展示区

  2 导航区的a标签改为link标签或者NavLink

        <Link to='/组件名'>Demo</Link>

        <NavLink to='/组件名'>Demo</NavLink >

  3 展示区写Route标签进行路径的匹配

        <Router path='/路径名' component={组件名} />

  4 <App>最外层包裹一个<BrowerRouter>或<HashRouter>

结构准备

首先安装路由

这里以旧版本演示

npm i react-router-dom@5 

准备两个组件

 

 

 

 可以看到浏览器地址栏中的路径地址只有最后面的有变换,并且浏览器并没有进行刷新

说明react的路由已经起作用

路由组件与一般组件

1 写法不同:

        一般组件: <Demo/>

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

2 存放位置不同:

        一般组件: components

        路由组件: pages

3 接收到的props不同

        一般组件: 写组件标签时传递了什么属性 就能收到什么

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

                         history,location,match

上面演示的存在一定的问题,就是如果我们有多个需要书写的NavLink标签的话,它们的标签属性大部分一致的情况下,只有to属性不同,这个时候我们其实可以进行自定义封装NavLink来进行优化

新建自定义组件,包裹NavLink

使用自定义组件时,只传递刚才两个组件不同的部分 

测试

 可以看到标签体内容是一个特殊的标签属性

通过this,props.children来获取标签体内容

路由的模糊匹配

路由默认开启的是模糊匹配

并且模糊匹配时的路径顺序也是有要求的

 

 可以看到模糊匹配起效果了

路径地址虽然是/foot/hj,但还是定位到了foot组件

下面来查看它的顺序性

foot在后面 

 foot顺序不在首位进行模糊匹配时没有正确路由出foot组件

此时说明其模糊匹配的规则是模糊匹配后面包含的路径

路由的精准匹配

路由通过标签的 exact属性来控制路由的精准匹配

 当标签添加了exact属性(默认为true)时,可以看到模糊匹配已经失效,此时需要精准配置路由路径

 

 Redirect

可以配置页面刚打开加载时重定向到指定的组件

未设置重定向时:

 

 

 嵌套路由

一般在开发中会有多个组件嵌套,此时再进行路由导航时就需要用到嵌套路由进行路由定义

再在foot组件中定义两个子组件,news,msg,两个组件结构都一致,只有显示内容不一样

 定义嵌套路由

注意嵌套路由定义时exact属性最好不要加,不然会由于精准匹配使得嵌套路由失效

 

路由传参

声明式路由

路由传递params参数

准备一个detail组件,当点击msg组件内的消息体时进行参数传递

 打印查看参数

 

可以看到数据传递到了props的match的params属性中

 

 绑定数据

search(也称query)参数

 查看传参位置

 发现参数都在props的location的search里

但是参数是 ?id=5&title=戴拿&remark=宇宙该溜子 这种urlencode格式的

这里使用 querystringify库直接进行格式转换

安装 querystringify库

npm i querystringify

引入使用:

 state传参

前面两种传参方式都会把参数暴露在地址栏中,这种方式并不是特别安全,路由传参还可以使用state进行传参

 可以看到参数都在props.location.state中,并且地址栏中并没有暴露参数

编程式路由导航

借助this.props.history对象上的API对操作路由跳转、前进、后退
路由跳转并留下历史记录:this.props.history.push()
路由跳转但不留下历史记录:this.props.history.replace()
路由后退一条记录:this.props.history.goBack()
路由前进一条记录:this.props.history.goForward()
路由前进或后退任意位置:this.props.history.go()

编程式路由导航传参和前面的三种形式几乎一致

 

踩坑警告 这里如果使用的是state传参方式的编程式导航的话.主页面js处要使用BrowerRouter包裹

 使用HashRouter会使state变为undefined

下面以1分左右gif图展现这个坑

 params和search传参和声明式传参一致,这里就不做演示

withRouter

withRouter可以加工一般组件 让一般组件具备路由组件所特有的Api

withRouter的返回值是一个新组件

之前我们都是直接测试的路由组件,所以可以直接使用路由组件持有的api,

如果是一般组件那么该如何让一般组件也能调用路由组件的api从而进行编程式导航呢

演示

准备一个一般组件 low组件

 

测试:

可以看到low组件中打印props为空对象,根本没有路由组件所有的那些api

 这种情况下就可以使用withRouter来对一般组件进行包装

此时就可以让一般组件直接使用路由组件的api了

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

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

相关文章

API架构的选择,RESTful、GraphQL还是gRPC

文章目录 一、RESTful1、什么是RESTful&#xff1f;2、RESTful架构的原则3、RESTful的适用场景4、RESTful的优点5、RESTful的缺点 二、GraphQL1、什么是GraphQL&#xff1f;2、GraphQL的原则3、GraphQL的优点4、GraphQL的缺点 三、gRPC1、什么是gRPC2、gRPC的应用场景3、gRPC的…

SpringBoot打包轻身方法

前言: 记得有人说过,Sb(ps:简称:SpringBoot)可以采用镜像分离进行部署打包,但是这种的话需要docker环境,由于Docker不会使用,还会在Centenos中出现各种错误,无法解决.个人菜 纯属个人意见,本次不会采用Docker 进而采用maven的插件进行打包. 1,在pom文件中加入配置以下: <bu…

队列的实现(附含三道经典例题)

&#x1f349;文章主页&#xff1a;阿博历练记 &#x1f4d6;文章专栏&#xff1a;数据结构与算法 &#x1f68d;代码仓库&#xff1a;阿博编程日记 &#x1f365;欢迎关注&#xff1a;欢迎友友们点赞收藏关注哦&#x1f339; 文章目录 &#x1f33e;前言&#x1f3ac;队列&…

HACK ME PLEASE: 1

文章目录 HACK ME PLEASE: 1实战演练一、前期准备1、相关信息 二、信息收集1、访问网站2、端口扫描2、扫描目录3、访问网站4、访问网站5、扫描目录6、访问网站7、登录MySQL数据库8、查看数据表9、查看users表的内容10、查看tblUsers表内容11、解密12、加密13、修改密码14、查询…

解决Ubuntu 22.04 程序以管理员权限运行无法播放声音

文章目录 摘要需求背景问百度问GPT最终解决方案,这篇文章的核心第一步,把root账户加入到组里面,第二步,编写一个服务文件第三步,允许这个文件第四步,启动服务第五步,修改Config文件第六步,重启电脑关键字: Qt、 pulseaudio、 管理员、 声音、 服务 摘要 这个是我…

CentOS 7.9配置SSH免密登录(无需合并authorized_keys)

场景&#xff1a;在CentOS 7.9操作系统上&#xff0c;配置SSH免密登录&#xff0c;以满足集群中应用的控制脚本能够依赖SSH来执行针对整个集群的操作。 版本&#xff1a; 操作系统&#xff1a;CentOS 7.9 1.配置SSH免密登录原因 (1)规划安装和部署的组件在运行时&#xff0…

科技云报道:ChatGPT的胜利,宣告知识图谱的消亡?

科技云报道原创。 过去10年&#xff0c;知识图谱可谓是最接近“人工智能”的概念。业内普遍认为&#xff0c;知识图谱的概念最先是由谷歌于2012年正式提出&#xff0c;主要用来支撑下一代搜索和在线广告业务。 此后&#xff0c;这项技术迅速火爆&#xff0c;被国内外多家搜索…

FasterTransformer5.0编译安装与测试

基础环境&#xff1a;centos7 cuda10.2cudnn7 显卡&#xff1a;Tesla V100 1 C编译准备 代码准备&#xff1a; git clone -b release/v5.0_tag https://github.com/NVIDIA/FasterTransformer.git mkdir -p FasterTransformer/build cd FasterTransformer/build git submodu…

2023年还有人在纠结如何学习黑客知识?

首先我谈下对黑客&网络安全的认知&#xff0c;其实最重要的是兴趣热爱&#xff0c;不同于网络安全工程师&#xff0c;他们大都是培训机构培训出来的&#xff0c;具备的基本都是防御和白帽子技能&#xff0c;他们绝大多数的人看的是工资&#xff0c;他们是为了就业而学习&am…

【国产虚拟仪器】基于AD9172/AD9176的4 通道12.6GSPS 采样率16 位DA 播放FMC JESD204B 接口子卡模块

板卡概述 FMC_XM131 是一款4 通道12.6GSPS 采样率16 位DA 播放FMC子卡模块&#xff0c;该板卡为FMC标准&#xff0c;符合VITA57.4 规范&#xff0c;可以作为一个理想的IO 模块耦合至FPGA 前端&#xff0c;16 通道的JESD204B 接口通过FMC连接器连接至FPGA 的高速串行端…

day7 - 使用几何变换让图像动起来

本期将了解图像的几何变换。几何变换是指改变图像的几何结构&#xff0c;例如大小、角度和形状等&#xff0c;让图像呈现出缩放、翻转、映射和透视的效果。 完成本期内容&#xff0c;你可以&#xff1a; 了解几何变换的定义掌握几何变换的原理和使用 若要运行案例代码&#…

【正点原子STM32连载】 第十五章 按键输入实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第十五…

Vue之MVVM模型

文章目录 前言一、简说MVVM模型二、走进MVVM总结 前言 Vue的创建者在创建Vue时没有完全遵守MVVM&#xff08;一种软件架构模式&#xff09;&#xff0c;但是Vue的设计受到了他它的启发。这也是为什么经常用vm&#xff08;ViewModel的缩写&#xff09;这个变量名表示Vue实例。 …

服了呀,被现在的00后卷麻了....

现在的小年轻真的卷得过分了。前段时间我们公司来了个00年的&#xff0c;工作没两年&#xff0c;跳槽到我们公司起薪18K&#xff0c;都快接近我了。后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。 最近和他聊了一次天&#xff0c;原来这位小老弟家里条…

docker创建emqx容器,emqx版本4.4.9

题记&#xff1a;网上找了很多文章&#xff0c;都没能怎么说明白如何对mqtt连接通信做认证&#xff0c;也就是tcp方式的时候&#xff0c;携带user、password&#xff0c;很苦恼&#xff0c;最后找了一大圈&#xff0c;说emqx的4.4.9版本的Dashboard有插件&#xff0c;果然顺藤摸…

vue动态class的写法

本文会详细介绍 vue动态 class的写法&#xff0c;并且提供一些我个人的理解&#xff0c;希望对你有所帮助。 如果你是一个新手&#xff0c;或者想了解 vue的源码&#xff0c;那么首先应该学习 vue的基础知识&#xff0c;比如&#xff1a;什么是静态语言&#xff0c;有什么作用等…

155. 最小栈

题目描述&#xff1a; 主要思路&#xff1a; 利用辅助栈来实现&#xff0c;一个最小栈用类似于单调栈的方法进行维护&#xff0c;具体见代码。 class MinStack { private:stack<int> x;stack<int> minx; public:MinStack() {minx.push(INT_MAX);}void push(int v…

IMX6ULL的I2C驱动详细分析

IMX6ULL的I2C驱动详细分析 文章目录 IMX6ULL的I2C驱动详细分析i2c_imx_driver 的平台驱动注册i2c_imx_probe注册函数i2c_imx_algoI2C算法结构体i2c_imx_start开始I2Ci2c_imx_stop停止I2Ci2c_imx_isr中断服务函数i2c_imx_dma_writeDMA 进行写操作的 I2C 传输2c_imx_dma_readi2c_…

动图怎么拆分成静图?简单快速分解gif的方法

怎么把gif动图变成静态图片&#xff1f;常见的gif动图画面生动丰富&#xff0c;是由一帧一帧静态的图片合成的&#xff0c;当我们想要把gif动图拆分成多张图片的时候要怎么操作呢&#xff1f;有没有什么简单方便的工具吗&#xff1f; 一、有没有简单方便的gif工具呢&#xff1…

Linux内存简介

Linux内存简介 概述 为何MemTotal小于RAM容量 [rootiZbp1dphe2bpv39op1g123Z ~]# dmesg | grep Memory [ 1.391064] Memory: 131604168K/134217136K available (14346K kernel code, 9546K rwdata, 9084K rodata, 2660K init, 7556K bss, 2612708K reserved, 0K cma-reserved) …