0603基础使用(二)-react路由-react

news2024/11/15 13:49:07

文章目录

    • 3 NavLink简单封装
    • 4 switch的使用
    • 5 解决样式丢失问题
    • 6 路由的模糊匹配和严格匹配
    • 7 Redirect
    • 结语

3 NavLink简单封装

在之前使用NavLink标签时,只有2个,代码如下:

<NavLink activeClassName="g2zh" className='list-group-item' to="/about">About</NavLink>
<NavLink activeClassName="g2zh" className='list-group-item' to="/home">Home</NavLink>

试想一想,如果我们路由链接有十几个或者更多时,如果还上这样写代码就有很多冗余,即activeName和className有大量重复,这时我们可以考虑对NavLink简单封装,封装为一个一般组件。

一般组件MyNavLink初始代码3-2如下:

import React, { Component } from 'react'
import { NavLink } from "react-router-dom";

export default class MyNavLink extends Component {
  render() {
    return (
      <NavLink activeClassName="g2zh" className='list-group-item' to="/about">About</NavLink>
    )
  }
}

其中to为组件的属性,我们可以通过props来动态接收,那么About这个标签体内容我们如何动态接收呢?

在react组件中,标签体是一种特殊的props,key被指定为children,value为标签体的值。

对上述MyNavLink组件做动态修改如下:

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

相应的App.jsx路由组件改为我们自定义的一般组件,代码如下:

<MyNavLink to="/about">About</MyNavLink>
<MyNavLink to="/home">Home</MyNavLink>

如果我们想写闭合标签的形式,怎么做呢?即写成<MyNavLink />的形式,前面我们提到标签体也是一种prop,然后key为指定的children,修改如下:

<MyNavLink to="/about" children="About" />
<MyNavLink to="/home" children="Home" />

总结

  • NavLink可以实现路由链接的高亮,通过activeName指定样式;
  • 标签体内容是一个特殊的标签属性;
  • 通过this.props.children可以获取标签体内容。

4 switch的使用

我们在定义一个Test路由组件,代码4-1如下所示:

import React, { Component } from 'react'

export default class Test extends Component {
  render() {
    return (
      <h3>我是test的内容</h3>
    )
  }
}

APP.jsx代码4-2如下所示,其他同上:

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

页面效果图4-1如下所示:

在这里插入图片描述

正常我们一个路由链接对应一个路由组件,现在我们点击Home链接,因为path属性相同,都匹配且展示。

react做路由匹配默认从头匹配到结束,只要path值对应,都能匹配,这样不符合我们预期,且效率很慢。这时候,需要用到switch

Switch 是 React Router 提供的一个组件,它用于将路由包装在一起,只渲染第一个匹配的路由。也就是说,如果一个 URL 匹配了多个路由,Switch 只会渲染第一个匹配的路由,忽略其他的路由。

我们修改App.jsx代码4-3如下所示:

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

5 解决样式丢失问题

有这么一个需求,我们希望我们的路径前面同一加上公司标志或者团队标志。那么我们现在修改路由链接和路由组件,如下所示:

<div className="list-group">
  {/* react中靠路由链接实现组件切换--编写路由链接 */}
  <MyNavLink to="/g2zh/about">About</MyNavLink>
  <MyNavLink to="/g2zh/home">Home</MyNavLink>
</div>
{/*省略其他 */}
<div className="panel-body">
  {/* 注册路由 */}
  <Switch>
    <Route path="/g2zh/about" component={About} />
    <Route path="/g2zh/home" component={Home} />
  </Switch>
</div>

当前项目启动后,点击路由链接切换等,样式都正常。但是当我们刷新页面的时候,样式丢失了,动态演示图5-1如下所示:

在这里插入图片描述

  • 知识点:

我们的脚手架项目webpack配置内置devServer服务器,默认根路径为public。当 React 前端应用找不到请求的资源时,通常会返回 index.html 文件,这是因为 React 的应用通常是一个单页应用(SPA),只有一个 HTML 文件,所有的路由和组件都是在该 HTML 文件中动态加载的。

我们的样式通过bootstrap.css实现的

  • 初始启动,浏览器地址:http://localhost:3000,默认加载publick下index.html.

  • Index.html通过<link rel="stylesheet" href="./css/bootstrap.css">加载样式,我们查看下网络请求 :在这里插入图片描述

    • 通过相对路径可以正常请求到样式,页面正常。
  • 当我们刷新时,我们在观察下网络请求样式:在这里插入图片描述

    • 根据相对路径,请求路径为Request URL: http://localhost:3000/g2zh/css/bootstrap.css,该路径下资源不存在,返回了首页。样式加载失败,页面表现就是样式丢失。
  • 造成样式丢失原因:多级路径下,刷新页面;样式通过非’/‘开头的相对路径引入,导致样式加载失败。

  • 解决方案:

    • 方式一:我们首页引入样式通过非’/‘相对路径引入样式,那么我们就把引入样式的方式通过’/‘开头引入样式,即固定去跟路径下寻找资源,不会造成样式丢下。

      • 首页样式样式代码修改如下```

        <link rel="stylesheet" href="/css/bootstrap.css">
        
    • 方式二:通过绝对路径形式,我们的静态资源一般放在public某个路径下,%PUBLIC_URL%在react脚手架中表示public文件夹的绝对路径。

      • 首页样式引入修改如下

        <link rel="stylesheet" href="%PUBLIC_URL%/css/bootstrap.css">
        
    • 方式三(不推荐):把BrowserRouter替换为HashRouter,hash模式刷新的时候#后面会忽略。

      • 作为参考,美团前端使用react,属性页面属性并不会丢失,同时页面路由使用BrowserRouter。

6 路由的模糊匹配和严格匹配

React 路由提供了两种匹配方式:模糊匹配(默认)和严格匹配。它们之间的区别在于,模糊匹配会忽略 URL 中的多余部分,而严格匹配则要求 URL 必须完全匹配。

默认情况下,React 路由采用模糊匹配方式,这意味着如果当前 URL 的开头部分与某个路由规则相匹配,就会将其视为匹配成功,无论后面是否还有其他路径。

例如,如果路由规则如下:

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

那么,以下 URL 都会被视为匹配成功:

  • /about
  • /about/
  • /about/something-else

这是因为模糊匹配会忽略 URL 的多余部分,只关注开头部分是否匹配。

如果想要采用严格匹配方式,需要将 <Route> 组件的 exact 属性设置为 true,如下所示:

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

这样,只有当 URL 完全匹配 /about 时,才会视为匹配成功。因此,以下 URL 都不会被视为匹配成功:

  • /about/
  • /about/something-else

需要注意的是,严格匹配通常适用于只有一个路由规则的情况,如果有多个路由规则,可能会导致一些问题。例如,如果有以下两个路由规则:

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

那么,当访问 /about 时,由于第一个路由规则采用了严格匹配,因此不会匹配成功,从而导致渲染结果出现错误。因此,在使用严格匹配时,需要仔细考虑每个路由规则的具体情况,以免出现问题。

总结:

  • 默认使用模糊匹配,即输入的路径匹配起始路由规则;
  • 开启严格匹配模式,添加exact属性,输入路径与批评规则严格一致;
  • 严格模式需要在开启,可能导致无法匹配二级路由。

7 Redirect

<Redirect> 组件是 React Router 提供的一种路由重定向的方式。它可以将用户重定向到另一个 URL,用于在用户访问某些页面时进行身份验证或其他控制流程。

<Redirect> 组件通常用在路由渲染函数中,当路由匹配成功时,返回一个 <Redirect> 组件,该组件会自动将用户重定向到指定的 URL

应用场景:我们前面的测试案例,默认启动展示区不展示任何东西,但是正常应用,比如后台管理未登陆情况下会重定向至登陆页,在登陆后会默认显示dashboard等等。

改造我们的测试示例,App.jsx代码7-1如下所示:

{/* 注册路由 */}
<Switch>
  <Route path="/about" component={About} />
  <Route path="/home" component={Home} />
  <Redirect to="/about"></Redirect>
</Switch>

效果就是启动之后,我们的‘/‘路径在匹配不上其他的路由时,重定向’/about’,即展示区显示About组件的内容。

总结:

  • 一般写在所有路由注册的最下方,当所有路由都无法匹配时,重定到Redirect指向的路由。

结语

❓QQ:806797785

⭐️源代码仓库地址:https://github.com/gaogzhen/react-staging.git

参考:

[1]React视频教程[CP/OL].2020-12-15.p79-84.

[2]React官网[CP/OL].

[3]ChatGPT[CP/OL].

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

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

相关文章

C#:如何用分部类将一个大文件改为多个小文件?

很多时候我们会发现&#xff0c;写来写去&#xff0c;一个文件慢慢就变得很大了&#xff0c;行数过千基本上就维护比较困难。 将公共代码模块化&#xff0c;可以减少一些代码&#xff0c;也是非常有效的。 那还有其它办法吗&#xff1f; 用 分部类 可以解决。 下面是简单的…

eBPF的发展演进---从石器时代到成为神(三)

4. 内在驱动 由以上简要的回顾和梳理可见&#xff0c;内核开发者们所不断寻找的是一种充分表达能力的动态机制&#xff0c;进而打破内核和用户态的壁垒&#xff08;至少在逻辑层面&#xff09;&#xff0c;从而实现一种自由、直接的需求实现。技术成为内核开发者们锋利的工具&…

UE4/5 行为树使用教程

使用行为树首先需要保证目标蓝图是继承自Character基类。然后根据本文下面的流程操作即可。 1.创建AIController 首先需要在角色自身蓝图之外创建一个新的蓝图&#xff0c;继承自AIController&#xff1a; 2.挂载AIController 找到角色自身蓝图类设置中的Pawn一栏&#xf…

云LIS系统是什么?云LIS系统的功能有哪些?

云LIS系统源码 C#医学检验云LIS平台源码 云LIS系统是什么&#xff1f; 云LIS是为区域医疗提供临床实验室信息服务的计算机应用程序&#xff0c;可协助区域内所有临床实验室相互协调并完成日常检验工作&#xff0c;对区域内的检验数据进行集中管理和共享&#xff0c;通过对质量…

C#探索之路(7):初探LitJson库并了解其中json的解析原理与处理报错

C#探索之路(7)&#xff1a;使用LitJson库解析数据抛出的异常错误修复指南与途径Tips 对Json格式的了解程度一定程度上影响了解决JSON相关问题的效率&#xff1b; 文章目录 C#探索之路(7)&#xff1a;使用LitJson库解析数据抛出的异常错误修复指南与途径Tips1、初步较为系统的去…

TryHackMe-Mnemonic(boot2root)

Mnemonic I hope you have fun. 端口扫描 循例nmap FTP枚举 尝试anonymous Web枚举 进80 gobuster扫 对着webmasters再扫一下 对着backups继续扫 下载zip文件&#xff0c;发现有密码 zip2john john直接爆 查看note.txt, 给出了ftpuser hydra直接爆ftp 进到ftp 用wget下载所…

VR全景图片,探究VR全景图片为何如此受欢迎?

随着科技的不断进步&#xff0c;虚拟现实技术逐渐渗透到我们的日常生活中&#xff0c;为我们带来了许多前所未有的体验和乐趣。而其中&#xff0c;VR全景图片作为一种基于虚拟现实技术的图片展示形式&#xff0c;不仅在旅游、房地产、教育等领域得到了广泛的应用&#xff0c;也…

【Java基础】语法基础

本文适合有编程基础或是需要Java语言复习的家人们食用~ 一、Java语言介绍 本篇文章使用的JDK版本是1.8&#xff08;即JDK 8&#xff09;Java语言是运行在JVM上的&#xff0c;有了JVM&#xff0c;Java语言得以在不同操作系统上运行垃圾回收机制&#xff1a;Java语言提供了一种…

文献阅读 Meta transfer learning-based super-resolution infrared imaging

题目 Meta transfer learning-based super-resolution infrared imaging 基于元迁移学习的超分辨率红外成像 摘要 我们提出了一种具有元迁移学习和轻量级网络的红外图像超分辨率方法。我们设计了一个轻量级网络来学习低分辨率和高分辨率红外图像之间的映射。我们使用外部数据…

科大讯飞版ChatGPT开始内测《讯飞星火》

科大讯飞版ChatGPT产品&#xff0c;提前交卷了&#xff01; 就在昨夜&#xff0c;讯飞骤然向开发者提供了内测通道&#xff0c;取名为讯飞星火认知大模型对外开启内测。 还有个神奇的英文名字Spark Desk&#xff0c;据说有“火花桌面智能助手”的意思。 申请的过程很简单。用…

Speech and Language Processing-之文本规范化

在对文本进行几乎任何自然语言处理之前&#xff0c;都必须对文本进行规范化。至少有三个任务通常作为任何规范化过程的一部分: 1. 分词 2. 规范化词格式 3. 句子分段 让我们从一个简单的(如果有点幼稚的话)单词标记化和非malization(以及频率计算)版本开始&#xff0c;它可以…

CIC 滤波器——不同长度的单级CIC滤波器的频谱特性

CIC 滤波器 % 多速率信号处理过程的关键是设计满足要求的抗混叠滤波器&#xff1a; % 第一&#xff1a;滤波器在有用信号频段内的纹波系数满足要求&#xff1b; % 第二&#xff1a;抽取或内插处理后&#xff0c;在有用信号频段内不产生频谱混叠&#xff1b; % 第三&#xf…

ASM磁盘组增加磁盘

续昨天的问题&#xff0c;DATA磁盘组空间不足的问题&#xff0c;客户也紧张&#xff0c;一早就讨论方案&#xff0c;新增2个2T的磁盘&#xff0c;将原来2个500G磁盘下线&#xff0c;下午存储端配置后&#xff0c;下面就是主机和数据库的事情&#xff08;为了避免客户信息泄露&a…

生成树协议 STP

文章目录 1 概述2 生成树协议 STP2.1 桥 ID&#xff08;Bridge ID&#xff09;2.2 路径开销&#xff08;Path Cost&#xff09;2.3 示例 3 扩展 1 概述 #mermaid-svg-QRMpkzeB3Xf66zNv {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#3…

【学习笔记】- 零基础学React

React是用于构建用户界面的JavaScript库。想要深入学习 react &#xff0c;就应该从 jsx 入手 react脚手架初始化项目 >> npm install -g create-react-app >> create-react-app proname >> npm run start运行之后&#xff0c;出现以下画面&#xff0c;至此…

DHCP服务

~ 安装和配置 DHCP 服务&#xff0c;为办公区域网络提供地址上网&#xff1b; ~ 创建地址池 inside_pool,地址池范围 192.168.0.100 - 192.168.0.200&#xff1b; ~ 根据题目 要求正确的配置网关和DNS信息&#xff1b; ~ 修改AppSrv 的dhcp服务器默认备份时间为150秒&#x…

案例3:Java汽车保养维修系统设计与实现开题报告

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

dll文件丢失怎么恢复,修复丢失dll的全部方法分享

dll文件丢失怎么恢复&#xff1f;其实DLL 或称为动态链接库文件&#xff0c;是 Windows 操作系统中的重要文件之一&#xff0c;它包含了被应用程序或操作系统内部使用的函数和程序代码。当应用软件或系统内置应用启动时&#xff0c;会自动加载对应的 DLL 文件以获得所需要的程序…

ArcGIS Pro、R、INVEST等多技术融合下生态系统服务权衡与协同动态分析

第一章、生态系统服务讲解 1.生态系统服务概念和基本理论 ​ 2.生态系统服务评估方法与模型讲解 ​ ​ 3.生态系统服务权衡与协同研究方法与意义 ​ 4.文献可视化分析 ​ ​ 第二章、平台基础 一、ArcGIS Pro介绍1. ArcGIS Pro简介2. ArcGIS Pro基础3. ArcGIS Pro数据预处理4…

FLink 里面的时间语义说明

本文说明一下flink的时间语义 处理时间&#xff08;processTIme&#xff09; 执行相关操作的机器系统时间。 如果flink的流式处理程序是基于processtime。那么代码中所有的操作都是将基于运算符的机器系统时钟时间。每小时的processTime window包括在系统时钟指示完整一个小时…