React之路由的基本操作

2023-11-13

路由的基本使用

1.明确好界面中的导航区、展示区
2.导航区的a标签改为Link标签
					<Link to="/xxxxx">Demo</Link>
3.展示区写Route标签进行路径的匹配
					<Route path='/xxxx' component={Demo}/>
4.<App>的最外侧包裹了一个<BrowserRouter>或<HashRouter>

路由组件与一般组件

1.写法不同:
			一般组件:<Demo/>
			路由组件:<Route path="/demo" component={Demo}/>
2.存放位置不同:
			一般组件:components
			路由组件:pages
3.接收到的props不同:
			一般组件:写组件标签时传递了什么,就能收到什么
			路由组件:接收到三个固定的属性
								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"

NavLink与封装NavLink

1.NavLink可以实现路由链接的高亮,通过activeClassName指定样式名

Switch的使用

1.通常情况下,path和component是一一对应的关系。
2.Switch可以提高路由匹配效率(单一匹配)。

解决多级路径刷新页面样式丢失的问题

1.public/index.html 中 引入样式时不写 ./ 写 / (常用)
2.public/index.html 中 引入样式时不写 ./ 写 %PUBLIC_URL% (常用)
3.使用HashRouter

路由的严格匹配与模糊匹配

1.默认使用的是模糊匹配(简单记:【输入的路径】必须包含要【匹配的路径】,且顺序要一致)
2.开启严格匹配:<Route exact={true} path="/about" component={About}/>
3.严格匹配不要随便开启,需要再开,有些时候开启会导致无法继续匹配二级路由

Redirect的使用

1.一般写在所有路由注册的最下方,当所有路由都无法匹配时,跳转到Redirect指定的路由
2.具体编码:
		<Switch>
			<Route path="/about" component={About}/>
			<Route path="/home" component={Home}/>
			<Redirect to="/about"/>
		</Switch>

嵌套路由

1.注册子路由时要写上父路由的path值
2.路由的匹配是按照注册路由的顺序进行的

实例

下面将通过一个实例一一分析上述用法。
在这里插入图片描述

文件目录

public

在这里插入图片描述
bootstrap.css自己下载即可
.ico是图标,可有可无

index.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
    <link rel="stylesheet" href="/css/bootstrap.css">
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .atguigu{
            opacity:0.5;
        }
    </style>
</head>
<body>
    <div id="root"></div>
</body>
</html>

这里使用

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

而不是

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

能够防止样式在多路由的丢失
atguigu的样式则是为了展现NavLink中的activeClassName属性准备的,点击会使得按钮的透明度发生变化。

src

在这里插入图片描述

index.jsx:

//引入react核心库
import React from 'react'
//引入ReactDOM
import ReactDOM from 'react-dom'
//
import {BrowserRouter} from 'react-router-dom'
//引入App
import App from './App'

ReactDOM.render(
	<BrowserRouter>
		<App/>
	</BrowserRouter>,
	document.getElementById('root')
)

入口文件,直接包着BrowserRouter,方便配置路由。因为在同一个一个路由器中才能进行路由匹配

App.jsx:

import React, { Component } from 'react'
import {Route,Switch,Redirect} from 'react-router-dom'
import Home from './pages/Home' //Home是路由组件
import About from './pages/About' //About是路由组件
import Header from './components/Header' //Header是一般组件
import MyNavLink from './components/MyNavLink'
import Show from './pages/Show'

export default class App extends Component {
	render() {
		return (
			<div>
				<div className="row">
					<div className="col-xs-offset-2 col-xs-8">
						<Header/>
					</div>
				</div>
				<div className="row">
					<div className="col-xs-2 col-xs-offset-2">
						<div className="list-group">

							{/* 原生html中,靠<a>跳转不同的页面 */}
							{/* <a className="list-group-item" href="./about.html">About</a>
							<a className="list-group-item active" href="./home.html">Home</a> */}

							{/* 在React中靠路由链接实现切换组件--编写路由链接 */}
							<MyNavLink to="/about">About</MyNavLink>
							<MyNavLink to="/home">Home</MyNavLink>
							<MyNavLink to="/show/hunter">Show</MyNavLink>
						</div>
					</div>
					<div className="col-xs-6">
						<div className="panel">
							<div className="panel-body">
								{/* 注册路由 */}
								<Switch>
									<Route path="/about" component={About}/>
									<Route path="/home" component={Home}/>
									<Route path="/show" component={Show}/>
									<Redirect to="/about"/>
								</Switch>
							</div>
						</div>
					</div>
				</div>
			</div>
		)
	}
}

App组件的内容。
点击About按钮,展示对应About组件
点击Home按钮,展示对应Home组件
点击Show按钮,展示对应Show组件,值得注意这里Show按钮to中的路由多了一截,因为是模糊匹配,因此当匹配到show时就可以认为匹配成功

<Redirect to="/about"/>

当按钮没有指定任何路由时,会自动重定向展示about组件

<Switch>

嵌套此标签则表示,匹配路由当匹配到之后便不再往下匹配,提高效率。

components

用于存放通用的组件

Header/index.jsx:
import React, { Component } from 'react'

export default class Header extends Component {
	render() {
		// console.log('Header组件收到的props是',this.props);
		return (
			<div className="page-header"><h2>React Router Demo</h2></div>
		)
	}
}

标题组件(一直存在)

MyNavLink/index.jsx:
import React, { Component } from 'react'
import {NavLink} from 'react-router-dom'

export default class MyNavLink extends Component {
	render() {
		// console.log(this.props);
		return (
			<NavLink activeClassName="atguigu" className="list-group-item" {...this.props}/>
		)
	}
}

用于存放能够进行路由跳转的组件,{…this.props}则是将传来的参数全都展开,activeClassName属性用于当此组件被点击会被赋予特定样式,to是跳转的路由,此组件中的chilren属性就是组件中展现的文字。

pages

用于存放设置好路由,点击按钮,才会展现的组件

About/index.jsx:
import React, { Component } from 'react'

export default class About extends Component {
	render() {
		// console.log('About组件收到的props是',this.props);
		return (
			<h3>我是About的内容</h3>
		)
	}
}

用于展示点击about按钮后的组件。

Home/ndex.js:
import React, { Component } from 'react'
import MyNavLink from '../../components/MyNavLink'
import {Route,Switch,Redirect} from 'react-router-dom'
import News from './News'
import Message from './Message'

export default class Home extends Component {
	render() {
		return (
				<div>
					<h3>我是Home的内容</h3>
					<div>
						<ul className="nav nav-tabs">
							<li>
								<MyNavLink to="/home/news">News</MyNavLink>
							</li>
							<li>
								<MyNavLink to="/home/message">Message</MyNavLink>
							</li>
						</ul>
						{/* 注册路由 */}
						<Switch>
							<Route path="/home/news" component={News}/>
							<Route path="/home/message" component={Message}/>
							<Redirect to="/home/news"/>
						</Switch>
					</div>
				</div>
			)
	}
}

Home组件。
Home组件中还有两个按钮分别是News和Message,点击按钮需要展示对应的子组件,这里可以配置多级路由,前提是子路由需要前一级和父路由匹配。

Home/Message/index.jsx:
import React, { Component } from 'react'

export default class Message extends Component {
	render() {
		return (
			<div>
				<ul>
					<li>
						<a href="/message1">message001</a>&nbsp;&nbsp;
					</li>
					<li>
						<a href="/message2">message002</a>&nbsp;&nbsp;
					</li>
					<li>
						<a href="/message/3">message003</a>&nbsp;&nbsp;
					</li>
				</ul>
			</div>
		)
	}
}

Home组件中需要展示的message组件。
可以发现其中的message按钮的路由并不存在,因此到时候会重定向到about中

Home/News/index.jsx:
import React, { Component } from 'react'

export default class News extends Component {
	render() {
		return (
			<ul>
				<li>news001</li>
				<li>news002</li>
				<li>news003</li>
			</ul>
		)
	}
}

Home组件中展示的News组件

运行

需要安装react-router-dom
因为这是5的实例
因此

yarn add react-router-dom@5

然后运行

npm start

打开网页
在这里插入图片描述
点击Show
在这里插入图片描述
发现可以匹配,证明模糊路由
Show按钮变淡,说明NavLink那个属性设置成功
点击Home
在这里插入图片描述
Home组件中的组件内容也展示成功。
点击Message
在这里插入图片描述
说明多级路由配置成功。
点击Message001
在这里插入图片描述
跳转到About组件内容
说明路由无法匹配到发生重定向成功。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React之路由的基本操作 的相关文章

  • 检测对给定 JavaScript 事件的支持?

    我有兴趣使用 JavaScript hashchange 事件来监视 URL 片段标识符的更改 我知道非常简单的历史 http code google com p reallysimplehistory 以及用于此目的的 jQuery 插件
  • 找不到 -lDoubleConversion 的库

    我尝试在 XCode 上构建 但是ld library not found for lDoubleConversion发生错误 我可以建造react native run ios 这可行 但 XCode 无法构建 ld 警告 找不到选项 L
  • ES6 类文字中的 IIFE

    在 ES5 中我们都可以这样做 myClass prototype myMethod function return function 我可以对 ES6 类文字执行同样的操作吗 不 至少现在还没有 ES6 类仅支持声明方法 因此任何不直接为
  • 弃用警告:时刻构造回退到 js Date

    我正在尝试转换这个日期时间 150423160509 这是 utc 日期时间 改为以下格式 2015 04 24 00 05 09 本地时区 通过使用 moment js var moment require moment timezone
  • 如何针对 IE 进行优化?

    我有一个 JS 密集型应用程序 它在 IE 中运行缓慢 我将花费大约一周的时间来优化 IE 并且我想要一些关于尝试的方向 我发现这个线程引用Drip https ieleak svn sourceforge net svnroot iele
  • 如何显示/隐藏jsf组件

    在我的一个 JSF 应用程序中 顶部的标题部分包含 selectOneMenu 底部的内容部分显示过滤器组件 默认情况下 应用程序首先在顶部显示 selectOneMenu 数据 在底部显示相应的 Filter 信息 如果用户选择不同的se
  • 在Javascript中将RGB数组转换为RGBA数组的快速方法

    我正在使用的模拟器在内部存储 RGB 值的一维帧缓冲区 但是 HTML5 画布在调用 putImageData 时使用 RGBA 值 为了显示帧缓冲区 我当前循环遍历 RGB 数组并以某种方式创建一个新的 RGBA 数组与此类似 https
  • Moment.js 动态更新时间(以秒为单位)

    我试图显示时钟 that 每秒更新一次 e g 2015 年 1 月 5 日 12 05 01 它似乎对我来说工作得很好 对于相同的代码 并且只有 moment min js 指向v2 11 0 看看代码 来源 MilkyWayJoe va
  • dc lineChart 单击时弹出数据点信息

    我正在尝试检测折线图数据点上的点击 Per this answer dc scatter plot binding onClick event https stackoverflow com a 22772340 1873386 I am
  • 如何检查侧边栏视图是否已经在主干中渲染?

    通常 用户通过主页进入网站 然后我在那里渲染侧边栏视图 接下来 用户单击链接 路由器呈现另一个视图并替换原始内容视图 侧边栏视图不会重新渲染 当用户在子页面上单击刷新时 侧边栏不会呈现 如何检查视图是否存在并且已渲染 划分责任并坚持下去 不
  • Webpack - 资产大小限制中的警告:以下资产超出了建议的大小限制 (244 KiB)

    当我在生产模式下运行 webpack 时 有资产规模限制 超出 的警告 我怎样才能运行而不出现这个错误 在我的项目中 我包含 css 并且我看到 webpack 构建中包含一些 node module 目录 但是如果我排除 css 的 no
  • 获取输入图像类型选择的图片并加载到图像标签中

    所以 我有一个用于上传 img 文件的输入框 我想要做的是从该数据 或选定的源 中获取数据并将其路由到图像标签的 src 属性中 像这样的东西 http jsfiddle net QC2c4 http jsfiddle net QC2c4
  • 接下来如何在React应用程序中使用material-ui的rtl布局

    我想在我的 React 应用程序中使用 RTL 布局 我已经使用material ui下一版本来集成这个应用程序 我使用下面的代码来制作应用程序布局 RTL 某些组件在 RTL 布局中正常工作 但某些组件不受影响 App js Layout
  • 反应独特的“关键”错误

    我正在浏览 React 中的待办事项列表教程 并遇到以下错误 我花了相当长的时间 只是找不到错误 这是错误和组件的代码 这就是代码对于课程存储库 此提交中出现问题 https github com andrewjmead react cou
  • FullCalendar:如何重新创建/重新初始化 FullCalendar 或批量添加多个事件

    我正在尝试将新事件批量添加到日历中 但未能找到方便的使用方法 所以我决定用新的事件数组重新初始化视图 所以我尝试了以下方法 var events title Event start new Date y m d 10 description
  • Kendo 刷新 (DropDownList.refresh()) 不起作用错误未定义

    我试图在另一个 DropDownList 更改后刷新下拉列表 但 Refresh 方法未定义错误正在升级 我尝试再次读取数据源 它显示它正在加载 但数据仍然相同 帮助解决这个问题请 Code DropDownList1 change fun
  • 禁用移动设备上的锚点菜单点击

    我使用嵌套列表作为带有子菜单项的菜单 我曾经这样做过 如果您将鼠标悬停在主菜单项上 子菜单项将通过将显示从无更改为块来出现 我决定让子菜单看起来就像是下拉的 并使用了 CSS 过渡 我遇到的问题是 在第一种方法中 如果您触摸 iPad 上的
  • 如何在react.js中将/n替换为换行符?

    我正在尝试更换每一个 n to a br tag in ReactJS In my note note对象有一个包含多个的字符串 n in it 示例注释 注释 test ntest ntest 我尝试过的ReactJS note note
  • 如何使用 Chart.js 版本 3.2.1 在圆环图中添加文本

    我正在使用 Canvas 在 HTML 中使用 如何使用在圆环图中添加文本 这是我的 javascript 代码和 HTML 代码 我使用了图表js版本3 2 1 所以请给出相同版本 3 的解决方案 var overallStatsCanv
  • 使用 javascript 从亚马逊 URL 中抓取 ASIN

    假设我有一个像这样的亚马逊产品 URL http www amazon com Kindle Wireless Reading Display Generation dp B0015T963C ref amb link 86123711 2

随机推荐

  • Android JNI2--C++基础

    1 基础结构 C 标准支持 include
  • MATLAB之极坐标绘图

    目标是要绘制一个二维的极坐标彩色图 输入参数有三个 一个是角度 一个是半径 一个是颜色 说到极坐标绘图 第一个想到的就是polar啦 那就先试试吧 1 polar绘图 polar函数用来绘制极坐标图 调用格式为 polar theta rh
  • 数据结构-最小生成树、prim算法、kruskal算法

    目录 最小生成树 Prim算法 普里姆 Kruskal算法 科普斯卡尔 prim算法的实现思想 Kruskal算法的实现思想 最小生成树 如果一个连通图本身就是一棵树 则其最小生成树就是它本身 只有连通图才有生成树 非连通图只有生成森林 P
  • telnet 使用教程(新手篇)及问题集锦

    telnet经常用于测试网络及端口占用情况 具体使用如下 测试端口命令 telnet host 端口 例 telnet 192 168 31 100 8081 连接失败表示端口未占用 否则表示被占用 如下 8080端口已占用 例 telne
  • RACI模型

    1 什么是RACI模型 释义 RACI是一个相对直观的模型 用以明确组织变革过程中的各个角色及其相关责任 我们知道 变革过程是不可能自发或者自动进行的 必须有人对其进行作用 促使进程发生变化 因而 就很有必要对谁做什么 以及促发什么样的变革
  • dracut 使用笔记

    dracut 维基 https dracut wiki kernel org index php Main Page dracut 官方手册 https www kernel org pub linux utils boot dracut
  • luaframework框架中将protobuf文件转成lua文件

    在luaframework框架中提供了通讯工具protobuf 需要将protobuf文件转成lua文件使用 按步骤来 1 下载并安装Python 我下载的版本是2 7 8 这个去Python官网下载即可 我的Python安装目录如图 2
  • Mybatis-plus 集合分页方法

    一 静态分页 1 POM引用
  • 使用matplotlib做动态排名图

    数据源 数据 过程 1 将数据进行持久化存储 先使用pandas的read csv函数从网页端直接读取数据 并筛选部分数据 url https gist githubusercontent com johnburnmurdoch 4199d
  • 【网页设计】HTML+CSS 实现简单宣传网页设计展示

    网站设计包含 1 图片设计 有背景图片和颜色 同时有一张图片悬浮 2 字体设计 设置字体大小 颜色等内容 3 按钮设计 完成点击按钮后弹出视频窗口的功能 4 视频窗口 视频窗口包括视频进度条 调节音量 窗口全屏 调节视频播放速度以及画中画等
  • NetworkManager和network

    一 NetworkManager做了什么 NetworkManager确保网络连接正常 当检测到系统中没有网络配置但有网络设备时 NetworkManager会创建临时连接以提供连接 通过不同的工具 GUI nmtui nmcli 提供管理
  • 操作系统 页面置换算法:LRU和FIFO

    LRU Least Recently Used 最少使用页面置换算法 顾名思义 就是替换掉最少使用的页面 FIFO first in first out 先进先出 页面置换算法 这是的最早出现的置换算法 该算法总是淘汰最先进入内存的页面 即
  • flutter Image图片控件-知识点

    图片是大家做项目中常用最大控件之一 本篇针对项目中经常用的功能 做些总结 ImageProvider 是一个抽象类 主要定义了图片数据获取的接口load 从不同的数据源获取图片需要实现不同的ImageProvider 如AssetImage
  • Linux搭建SVN服务器

    1 安装SVN 官网下载 http subversion apache org packages html SVN客户端 TortoiseSVN 官网下载 http tortoisesvn net downloads html yum in
  • SpringCloud——GateWay入门

    客户由发送请求由Nginx服务器已经将请求转发到一个服务器上 但是服务之前我们还需要一个网关将这些请求进一步加工处理到服务上 这一步就是GateWay GateWay 1 GateWay服务是不需要进入以下jar包
  • Java_synchronized的锁对象之对象锁和类锁

    具体知识学习与 https blog csdn net yansuoo article details 51248281 https www jianshu com p 6586d9f3b515 下面是自己的理解 代码 一 前置知识 jav
  • 设计模式-建造者模式

    建造者模式是一种创建型设计模式 它允许你创建复杂对象的不同表示 而无需直接与其构造函数参数进行交互 建造者模式将一个复杂对象的构建与其表示分离 使得同样的构建过程可以创建不同的表示 建造者模式的核心思想是将一个复杂对象的构建过程分解为多个简
  • web前端基础——第二章

    目录 十八 表格标签 1 table tr th td caption 等 2 语义化标签 thead tbody tfoot 十九 表格属性 二十 表单标签 二十一 表格表单组合 二十二 div 与 span 1 div 做一个区域划分的
  • Redis 缓存清理

    redis中 key过期后并不会马上删除 而是同时使用了 3 种策略来删除这些key 惰性清除 访问key时 如果发现key已经过期 那么会将key删除 定时清理 每次清理会依次遍历所有DB 从db随机取出20个key 如果过期就删除 如果
  • React之路由的基本操作

    文章目录 路由的基本使用 路由组件与一般组件 NavLink与封装NavLink Switch的使用 解决多级路径刷新页面样式丢失的问题 路由的严格匹配与模糊匹配 Redirect的使用 嵌套路由 实例 文件目录 public index