React 路由

引言

在我们之前写的页面当中,用我们的惯用思维去思考的话,可能会需要写很多的页面,例如做一个 tab 栏,我们可能会想每个选项都要对应一个 HTML 文件,这样会很麻烦,甚至不友好,我们把这种称为 MPA 也叫多页面应用。

1. SPA

而为了减少这样的情况,我们还有另一种应用,叫做 SPA ,单页应用程序

它比传统的 Web 应用程序更快,因为它们在 Web 浏览器本身而不是在服务器上执行逻辑。在初始页面加载后,只有数据来回发送,而不是整个 HTML,这会降低带宽。它们可以独立请求标记和数据,并直接在浏览器中呈现页面

2. 什么是路由?

路由是根据不同的 URL 地址展示不同的内容或页面

在 SPA 应用中,大部分页面结果不改变,只改变部分内容的使用

前端路由的优缺点

优点

用户体验好,不需要每次都从服务器全部获取整个 HTML,快速展现给用户

缺点

  • SPA 无法记住之前页面滚动的位置,再次回到页面时无法记住滚动的位置
  • 使用浏览器的前进和后退键会重新请求,没有合理利用缓存

3. 路由的原理

前端路由的主要依靠的时 history ,也就是浏览器的历史记录

history 是 BOM 对象下的一个属性,在 H5 中新增了一些操作 history 的 API

浏览器的历史记录就类似于一个栈的数据结构,前进就相当于入栈,后退就相当于出栈

并且历史记录上可以采用 listen 来监听请求路由的改变,从而判断是否改变路径

在 H5 中新增了 createBrowserHistory 的 API ,用于创建一个 history 栈,允许我们手动操作浏览器的历史记录

新增 API:pushState replaceState,原理类似于 Hash 实现。 用 H5 实现,单页路由的 URL 不会多出一个 # 号,这样会更加的美观

4. 路由的基本使用

react-router-dom 的理解和使用

专门给 web 人员使用的库

  • 一个 react 的仓库
  • 很常用,基本是每个应用都会使用的这个库
  • 专门来实现 SPA 应用

首先我们要明确好页面的布局 ,分好导航区、展示区

要引入 react-router-dom 库,暴露一些属性 Link、BrowserRouter...

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

导航区的 a 标签改为 Link 标签

<Link className="list-group-item" to="/about">About</Link>

同时我们需要用 Route 标签,来进行路径的匹配,从而实现不同路径的组件切换

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

这样之后我们还需要一步,加个路由器,在上面我们写了两组路由,同时还会报错指示我们需要添加 Router 来解决错误,这就是需要我们添加路由器来管理路由,如果我们在 Link 和 Route 中分别用路由器管理,那这样是实现不了的,只有在一个路由器的管理下才能进行页面的跳转工作。

因此我们也可以在 Link 和 Route 标签的外层标签采用 BrowserRouter 包裹,但是这样当我们的路由过多时,我们要不停的更改标签包裹的位置,因此我们可以这么做

我们回到 App.jsx 目录下的 index.js 文件,将整个 App 组件标签采用 BrowserRouter 标签去包裹,这样整个 App 组件都在一个路由器的管理下

// index.js
<BrowserRouter>
< App />
</BrowserRouter>
react-router

 

5. 路由组件和一般组件

在我们前面的内容中,我们是把组件 Home 和组件 About 当成是一般组件来使用,我们将它们写在了 src 目录下的 components 文件夹下,但是我们又会发现它和普通的组件又有点不同,对于普通组件而言,我们在引入它们的时候我们是通过标签的形式来引用的。但是在上面我们可以看到,我们把它当作路由来引用时,我们是通过 {Home} 来引用的。

从这一点我们就可以认定一般组件和路由组件存在着差异

首先它们的写法不同

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

同时为了规范我们的书写,一般将路由组件放在 pages 文件夹中,路由组件放在 components

而最重要的一点就是它们接收到的 props 不同,在一般组件中,如果我们不进行传递,就不会收到值。而对于路由组件而言,它会接收到 3 个固定属性 history location 以及 match

6. NavLink 标签

NavLink 标签是和 Link 标签作用相同的,但是它又比 Link 更加强大。

在前面的 demo 展示中,你可能会发现点击的按钮并没有出现高亮的效果,正常情况下我们给标签多添加一个 active 的类就可以实现高亮的效果

而 NavLink 标签正可以帮助我们实现这一步

当我们选中某个 NavLink 标签时,就会自动的在类上添加一个 active 属性

<NavLink className="list-group-item" to="/about">About</NavLink>

我们可以看到左侧的元素类名在不断的切换,当然 NavLink 标签是默认的添加上 active 类,我们也可以改变它,在标签上添加一个属性 activeClassName

例如 activeClassName="aaa" 在触发这个 NavLink 时,会自动添加一个 aaa 类

7. NavLink 封装

在上面的 NavLink 标签种,我们可以发现我们每次都需要重复的去写这些样式名称或者是 activeClassName ,这并不是一个很好的情况,代码过于冗余。那我们是不是可以想想办法封装一下它们呢?

我们可以采用 MyNavLink 组件,对 NavLink 进行封装

首先我们需要新建一个 MyNavLink 组件

return 一个结构

<NavLink className="list-group-item" {...this.props} />

首先,有一点非常重要的是,我们在标签体内写的内容都会成为一个 children 属性,因此我们在调用 MyNavLink 时,在标签体中写的内容,都会成为 props 中的一部分,从而能够实现

接下来我们在调用时,直接写

<MyNavLink to="/home">home</MyNavLink>

即可实现相同的效果

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

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

相关文章

清华大学06届 计算机王煜,祝贺!这两位三年前从超银中学毕业的学霸,今年被清华大学“破格”录取啦...

青岛日报社/观海新闻8月13日讯 今年是“强基计划”首年招生&#xff0c;“强基计划”属于单独批次录取&#xff0c;也是高考所有批次录取中最早公布结果的&#xff0c;一经录取&#xff0c;就不再参加后续高考志愿录取投档。观海新闻记者从超银中学获悉&#xff0c;青岛二中今年…

jmeter web服务器协议,【JMeter4.0学习(三)】之SoapUI创建WebService接口模拟服务端以及JMeter测试SOAP协议性能测试脚本开发(示例代码)...

目录&#xff1a;【阐述】&#xff1a;首先应该遇到了一个共同的问题&#xff0c;JMeter3.2之后就没有WebService(SOAP) Request,后来经过查询网上资料得知其实可以用HTTP请求来操作&#xff0c;结果是一样的。【步骤】&#xff1a;一、创建WebService接口模拟服务端如果大家有…

滨江机器人餐厅_餐厅来了机器人服务员

龙源期刊网http://www.qikan.com.cn餐厅来了机器人服务员作者&#xff1a;柯静夏峥来源&#xff1a;《人民周刊》2016年第03期餐饮企业引入机器人&#xff0c;博的是眼球&#xff0c;省的是最关键的人力成本。不少人都希望身边有“大白”那样的暖男机器人&#xff0c;这并非遥不…

cad解除块的快捷命令_CAD撤销上一步和恢復下一步的快捷键是什么?

对于怎么撤回到上一步&#xff0c;大家想到最多的应该是Ctrl Z快捷键来撤销&#xff0c;但是如果在CAD编辑器中可直接使用返回命令即可&#xff01;具体操作方法如下&#xff1a;1.进入到软件的操作界面之后&#xff0c;鼠标点击软件最左侧菜单栏中的“文件”按钮&#xff0c;在…

本机上的ajax需要跨域吗,jQuery AJAX跨域

jQuery AJAX跨域这是两个页面&#xff0c;test.php和testserver.php。test.php的$(function() {$.ajax({url:"testserver.php",success:function() {alert("Success");},error:function() {alert("Error");},dataType:"json",type:&qu…

flask bootstrap ajax,使用Flask集成bootstrap的方法

1. 下载flask-bootstrappip install flask-bootstrap2. 找到base.html文件将site-packages\flask_bootstrap\templates文件夹下的bootstrap目录copy到你的项目\templates目录下&#xff0c;确保bootstrap目录下包含base.html文件&#xff0c;因为我们后面要用到。3. 代码user.h…

android 模糊读取文件名_Android 从路径中获取文件名 | 学步园

转载&#xff1a;http://androidstudy.iteye.com/blog/787560方法一&#xff1a;利用String类public String getFileName(String pathandname){int startpathandname.lastIndexOf("/");int endpathandname.lastIndexOf(".");if (start!-1 && end!-…

chrome切换前端模式_H5暗黑模式在京东收银台中的实践

背景暗黑主题下&#xff0c;用户可以选择采用深色的系统范围外观而不是浅色外观。在暗黑模式下&#xff0c;系统对所有窗口&#xff0c;视图&#xff0c;菜单和控件采用较暗的调色板。谷歌的 Gmail 和 Chrome 浏览器、聊天工具 slack、telegram、Edge 浏览器和 Office 移动版 A…

使用udp协议实现服务器端程序时,用VisualC#实现UDP协议(二)

12.并以下面代码替换Form.cs中由系统产生的InitializeComponent过程。private void InitializeComponent ( ){this.button1 new System.Windows.Forms.Button ( ) ;this.button2 new System.Windows.Forms.Button ( ) ;this.textBox1 new System.Windows.Forms.TextBox ( ) …

circlegan_CycleGAN原理以及代码全解析

许多名画造假者费尽毕生的心血&#xff0c;试图模仿出艺术名家的风格。如今&#xff0c;CycleGAN就可以初步实现这个神奇的功能。这个功能就是风格迁移&#xff0c;比如下图&#xff0c;照片可以被赋予莫奈&#xff0c;梵高等人的绘画风格这属于是无配对数据(unpaired)产生的图…

魅族16无信号服务器,魅族16信号差的解决办法

手机信号问题一直都是人们关注的问题&#xff0c;在日常使用时有些地方手机可能出现突然信号变差&#xff0c;可能别人的手机信号一直很好只有你的出现了问题。魅族手机最早的几个版本都很容易出现这种问题&#xff0c;新款的魅族16怎么样呢&#xff1f;魅族16信号差怎么解决呢…

服务器系统核心和带gui区别,Windows Server 2012图形用户界面(GUI)和服务器核心(Server Core)之间的切换...

当安装 Windows Server 2012 时&#xff0c;咱们能够在“服务器核心安装”和“彻底安装”之间任选其一。“带 GUI 选项的服务器”选项Windows Server 2012 等效于 Windows Server 2008 R2 中的彻底安装选项。“服务器核心安装”选项可减小所需的磁盘空间、潜在的***面&#xff…

用python控制键盘_【python黑科技-pyautogui】教你用python控制滑鼠与键盘

今天来聊聊python中非常酷炫的功能&#xff0c;控制滑鼠与键盘&#xff0c;理论上&#xff0c;如果你程序功力非常强的话&#xff0c;甚至可以用这个模组写出一个「游戏插件」&#xff0c;让程序操控你的滑鼠与键盘帮你玩游戏本文测试环境: anaconda, spyder, python3.7安装pya…

ulimit限制 新系统_Linux查看及修改系统的资源限制命令ulimit

在Linux&#xff0c;查看系统对资源使用的显示可以使用命令ulimit&#xff0c;其中参数-a会列出所有的资源使用限制。[demoserver ~]$ ulimit -acore file size (blocks, -c) 0data seg size (kbytes, -d) unlimitedscheduling priority (-e) 0file size (blocks, -f) unlimite…

华为策略路由加等价路由_华为——防火墙——策略路由配置及思路

华为——策略路由(校园网配置)作用&#xff1a;通过分析数据报的源地址和目标地址&#xff0c;按照策略规则选择不同的网关&#xff0c;进行数据转发。提供冗余&#xff0c;负载&#xff0c;但是还是单线路的速度。只是提供了不同的方向&#xff0c;并没有进行合并线路。拓扑图…

简述数学建模的过程_中文字幕乱码文字2020_MDTM-198加勒比中文字幕合集 - 第5页...

Well, you won’t get one from me.Nah, I never let a lady treat.I try to ease away and create a larger space cushion, but he steps toward me again. I don’t feel threatened by him, however. He’s a big guy, but not menacing. He isn’t trying to bully me wit…

头条自己提问的问题在哪看_在头条的这三十天

文、图&#xff1a;书海履痕今天入头条三十天&#xff0c;按民间俗语&#xff0c;满月了。 三十个日子&#xff0c;真得是感慨万千。特别是昨日的文章&#xff0c;经头条君和各位友友们的厚爱&#xff0c;让我经历了过山车的感觉&#xff0c;各种滋味存于心底&#xff0c;在此谢…

c可以 char* 赋值但是c++不可以_雷佳音的妻子完全可以女团C位出道,这么有气质的女人,谁能不爱...

导读&#xff1a;雷佳音的妻子完全可以女团C位出道&#xff0c;这么有气质的女人&#xff0c;谁能不爱各位点开这篇文章的朋友们&#xff0c;想必都是很高的颜值吧&#xff0c;我们真的是很有缘哦&#xff0c;小编每天都会给大家带来不一样的汽车资讯&#xff0c;如果对小编的文…

【加解密学习笔记:第一天】操作系统基础知识

加解密相关系统基础知识 Unicode编码格式 Unicode编码中使用2字节对字符进行编码&#xff0c;对ASCLL码的支持通过愿为不变&#xff0c;高位补零实现一个字有2字节&#xff0c;Intel在存入储存器时低位入低地址&#xff0c;高位入高地址&#xff08;Little-endian&#xff09…

oracle sequence 不同 会话 不连续_序列 Sequence

Sequence是一个数据库对象&#xff0c;多个用户可以从中生成唯一的整数&#xff0c;可以使用序列自动生成主键值。生成序列号时&#xff0c;序列号将递增&#xff0c;独立于事务提交或回滚;如果两个用户同时递增同一序列&#xff0c;因为序列号是由另一个用户生成的&#xff0c…