react---react router 5 基本使用

news2024/11/20 14:29:56

目录

1.路由介绍

2.路由使用

3.路由组件和一般组件

4.Switch 单一匹配

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

6.路由精准匹配和模糊匹配


1.路由介绍

路由是根据不同的 URL 地址展示不同的内容或页面,在 SPA 应用中,大部分页面结果不改变,只改变部分内容的使用。一个路由其实就是一个映射关系。

前端路由常见的两种模式:hash和history

hash模式:路由上会有个#号,#后面 hash 值的变化,并不会导致浏览器向服务器发出请求,浏览器不发出请求,也就不会刷新页面。使用 Javascript 来对 location.hash 进行赋值,改变 URL 的hash值,每次 hash 值的变化,会触发hashchange 这个事件。然后我们便可以监听hashchange来实现更新页面部分内容的操作。

history模式:使用history模式可以让URL看起来更加友好,更符合传统的URL访问习惯,不会出现#号,更加好看。当用户刷新页面之类的操作时,浏览器会给服务器发送请求,所以这个实现需要服务器的支持,需要把所有路由都重定向到根页面(nginx配置try_files重定向到index.html),否则会出现404。HTML5 提供了 History API 来实现 URL 的变化,其中最主要的 API 有以下两个:
history.pushState() 新增一个历史记录
history.replaceState() 直接替换当前的历史记录

2.路由使用

  • 安装【npm i react-router-dom@5】
  • 引入使用到的一些标签【import{Link,Route}from 'react-router-dom'】
  • 编写路由链接【Link,NavLink】
  • 注册路由【 <Route path="/home" component={Home}></Route>】
  • 路由包裹【ReactDOM.render(<BrowserRouter> <App/> </BrowserRouter>, document.getElementById("root"));】整个 App 组件标签采用 BrowserRouter (或使用HashRouter)标签包裹,这样整个 App 组件都在一个路由器的管理下。
{/*  编写路由链接*/}
<Link to="/home">Home</Link>
<NavLink activeClassName="nav-active" to="/home">Home</NavLink>
<MyNavLink to="/home">Home</MyNavLink> //通过封装把冗长的NavLink上的标签放到组件上去了

NavLink给a标签带上了active属性(高亮设置),通过activeClassName 来修改默认的高亮类名

基于NavLink封装MyNavLink组件

【MyNavLink组件】

import React, { Component } from 'react'
import { NavLink } from 'react-router-dom/cjs/react-router-dom'

export default class MyNavLink extends Component {
  render() {
    console.log("MyNavLink接收父组件传值props",this.props);
    return (
        <NavLink activeClassName="nav-active" {...this.props}></NavLink>
    )
  }
}

在标签体内写的内容都会成为一个 children 属性,因此我们在调用 MyNavLink 时,在标签体中写的内容,都会成为 props 中的一部分。如下MyNavLink标签内的内容Home会成为props的children属性

<MyNavLink to="/home" a={1} b={2}>Home</MyNavLink>

3.路由组件和一般组件

  • 写法不同:一般组件【<Home/>】,路由组件【 <Route path="/home" component={Home} />】
  • 存放的位置不同:路由组件放在 pages 文件夹中,一般组件放在 components文件夹中
  • 最重要的一点就是它们接收到的 props 不同,在一般组件中,如果我们不进行传递,就不会收到值。而对于路由组件而言,它会接收到 3 个固定属性 history 、location 以及 match
history:
    go: ƒ go(n)
    goBack: ƒ goBack()
    goForward: ƒ goForward()
    push: ƒ push(path, state)
    replace: ƒ replace(path, state)
location:
    pathname: "/about"
    search: ""
    state: undefined
match:
    params: {}
    path: "/about"
    url: "/about"

4.Switch 单一匹配

 当/about路径匹配上了第一个About 组件后,它还会继续向下匹配Test组件,采用 Switch 组件进行包裹后只进行单一匹配,不会再向下去匹配了,可以提高路由匹配效率。

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

当index.html以相对路径方式引入css文件时,【 <link href="./css/bootstrap.css" rel="stylesheet">】(该文件放在public/css路径下)在如下二级路由的情况下存在刷新页面导致样式丢失的问题。

<MyNavLink to = "/base/about" >About</MyNavLink>

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

http://localhost:3000是webpack内置的服务器,通过devServer开启的。public文件夹相当于是localhost:3000的根路径。

当刷新页面后,获取bootstrap.css文件的请求路径上带了base,并且返回状态码200,请求成功,这是因为请求的资源不存在时,会把index.html响应给该请求,所以状态码为200。

 (1)使用绝对路径/

 <link href="/css/bootstrap.css" rel="stylesheet"> 

(2)使用PUBLIC_URL%

 <link href="%PUBLIC_URL%/css/bootstrap.css" rel="stylesheet">

(3)使用HashRouter

因为HashRouter会添加#,默认不会处理#后面的路径,所以也是可以解决的

6.路由精准匹配和模糊匹配

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

模糊匹配可以理解为,在匹配路由时,只要有匹配到的就好了,要求输入的路径必须包含匹配的路径,且顺序要一致

<MyNavLink to = "/home/a/b" >Home</MyNavLink>
<Route path="/home"component={Home}/>

精准匹配:两者必须相同,通过exact开启严格匹配

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

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

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

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

相关文章

PostgreSQL 对特定类索引的优化,节省磁盘空间百倍 --BRIN 索引应用在生产案例...

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

为生信写的Python简明教程 | 视频5

开源生信 Python教程 生信专用简明 Python 文字和视频教程 源码在&#xff1a;https://github.com/Tong-Chen/Bioinfo_course_python 目录 背景介绍 编程开篇为什么学习Python如何安装Python如何运行Python命令和脚本使用什么编辑器写Python脚本Python程序事例Python基本语法 数…

Pytorch教程:Autograd基础

PyTorch的Autograd特征可以让PyTorch灵活快速的构建机器学习项目。autograd可以实现快速和容易的多重偏微分&#xff08;梯度&#xff09;计算。偏微分计算时反向传播神经网络学习的核心。 autograd的可以在运行时动态追踪计算&#xff0c;这意味着如果模型有决策分支、或者有…

linux 系统服务管理

目录 一、chkconfig 1、列出服务列表 chkconfig --list 2、关闭开启服务 chkconfig 服务名 on/off 3、添加新服务 chkconfig --add 服务文件名 4、删除已有服务 chkconfig --del 服务名 5、系统级别定义&#xff1a; 一、chkconfig chkconfig——centos…

Python学习46:分配学号(python123)

类型&#xff1a;列表元组‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬ 描述‪‬…

【Java项目】多种方式解决SpringBoot中遇到的控制台中文乱码问题

文章目录 配置JVM参数配置maven参数配置Runner配置Encoding通过配置文件 配置JVM参数 -Dfile.encodingUTF-8配置maven参数 重点就是 <configuration><fork>true</fork><jvmArguments>-Dfile.encodingUTF-8</jvmArguments></configuration>…

Linux常用命令——git命令

在线Linux命令查询工具 git 是目前世界上最先进的分布式版本控制系统 补充说明 git命令很多人都知道&#xff0c;Linus在1991年创建了开源的Linux&#xff0c;从此&#xff0c;Linux系统不断发展&#xff0c;已经成为最大的服务器系统软件了。 Linus虽然创建了Linux&#x…

线程池最佳实践

文章目录 yml参数配置定义参数实体bean配置线程池实战线程池高级理论线程池工作流程概述线程池拒绝策略线程池参数设置原则1&#xff09;如何为线程池设置合适的线程参数&#xff1f;2) 如何获取当前服务器的cpu核数&#xff1f;3) 无界队列问题 yml参数配置 # 定时任务线程池…

Spring高手之路1——深入理解与实现IOC依赖查找与依赖注入

本文从xml开始讲解&#xff0c;注解后面给出 文章目录 1. 一个最基本的 IOC 依赖查找实例2. IOC 的两种实现方式2.1 依赖查找&#xff08;Dependency Lookup&#xff09;2.2 依赖注入&#xff08;Dependency Injection&#xff09; 3. 在三层架构中的 service 层与 dao 层体会依…

Kafka与消息队列的比较

消息队列&#xff08;Message Queues&#xff09;是一种允许分布式系统和应用异步通信的服务。异步通信意味着消息发送者在等待接收者接收消息之前不需要等待&#xff0c;这可以提高性能和可扩展性&#xff0c;使应用能够并行处理消息。消息队列通过将消息存储在队列中来工作。…

【Vue_项目搭建部署】VUE快速入门——部署_安装ele等

检查是否安装 node npm npm -v node -v 全局安装yarn npm install -g yarn 安装完后&#xff0c;可以配置yarn的淘宝镜像 yarn config get registry //查看当前配置的镜像源 //https://registry.yarnpkg.com yarn config set registry http://registry.npm.taobao.or…

【Redis29】Redis进阶:缓存穿透、击穿与雪崩

Redis进阶&#xff1a;缓存穿透、击穿与雪崩 其实啊&#xff0c;这个内容本来不打算写了&#xff0c;网上讲这一块的内容实在是太多了。不过呢&#xff0c;本着学习还是要全面的原则&#xff0c;而且还要让自己多多巩固复习的原则&#xff0c;咱还是来写一道吧。 同样的&#x…

把钢铁侠战衣交给Z世代,没想到联想商用PC可以这么炫酷!

在数字化转型成为全球政企战略性与常态化诉求的今天&#xff0c;没有人会怀疑新一代数字技术和工具的重要性。 千行百业需要拥有全新的工具握力&#xff0c;也带动了商用 PC的市场需求不断被激发&#xff0c;产品升级迭代速度加快&#xff0c;成为PC行业最具发展机遇的市场。 从…

【Python】Python进阶系列教程--Python AI 绘画(二十)

文章目录 前言Windows 环境安装Civitai 介绍 前言 往期回顾&#xff1a; Python进阶系列教程-- Python3 正则表达式&#xff08;一&#xff09;Python进阶系列教程-- Python3 CGI编程&#xff08;二&#xff09;Python进阶系列教程-- Python3 MySQL - mysql-connector 驱动&a…

好几位朋友最近被迫创业!

见字如面&#xff0c;我是军哥&#xff01; 最近好几位朋友被迫创业&#xff0c;有程序员也有之前做业务的朋友&#xff0c;问其原因&#xff0c;都说现在找工作比较难&#xff0c;想想还是自己干吧。 对于这样的回答&#xff0c; 我表示非常的担心&#xff0c;因为风险实在是太…

VMIX如何RTMP推流给灵派编码器

本文链接&#xff1a;https://blog.csdn.net/weixin_45326556/article/details/131181058 第三方设备&#xff08;例如vMix&#xff0c;OBS&#xff09;如何RTMP推流给灵派编码器 1. 灵派编码器内置RTMP-SERVER2. 其他设备RTMP推流给灵派编码器方法3. 如何使用第三方推上来的RT…

Linux---ln命令、date命令

1. 链接命令ln ln&#xff08;link files&#xff09;命令的功能是为某一个文件在另外一个位置建立一个同步的链接。 当需要在不同的目录&#xff0c;用到相同的文件时&#xff0c;不需要在每一个目录下都放一个相同的文件&#xff0c;只需要在 某个固定目录&#xff0c;放上…

以正式员工身份从京东出来,又通过外包回去了,不甘心啊!

人生是一个圈&#xff0c;职场也是一个圈&#xff0c;一位京东员工就以实际行动诠释了这个“圈”&#xff1a; 以正式员工身份从京东出来&#xff0c;又通过外包回去了&#xff0c;不甘心啊&#xff0c;但外面找工作是地狱级难度&#xff01; 网友纷纷表示“笑死”、“有被笑到…

基于最小费用流(MCF)法的相位解包裹理论与实验验证-含Matlab代码

一、引言 最小费用流算法(Minimum cost flow, MCF) 最早是由 Costantini M. A1998 年提出的&#xff0c;该方法是将未解缠相位的相邻梯度差与解缠相位的相邻梯度差间的差异即不连续性最小化&#xff0c;具有极强鲁棒性与准确性&#xff0c;有基于规则与不规则网络之分。2002年…

Python实现ACO蚁群优化算法优化XGBoost分类模型(XGBClassifier算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蚁群优化算法(Ant Colony Optimization, ACO)是一种源于大自然生物世界的新的仿生进化算法&#xff0c…