react之路由的安装与使用

一、路由安装

  • 路由官网
  • 2021.11月初,react-router 更新到 v6 版本。
  • 使用最广泛的 v5 版本的使用
npm i react-router-dom@5.3.0

二、路由使用

2.1 路由的简单使用

第一步 在根目录下 创建 views 文件夹 ,用于放置路由页面

在这里插入图片描述

  • films.js示例代码
export default function Films() {return <div>films</div>
}

第二步 在根目录下 创建router文件夹,并新建indexRouter.js文件 用来管理路由

  • indexRouter.js 页面示例代码
//1.引入 hashrouter
import { HashRouter, Route } from 'react-router-dom'import { Component } from 'react'//2.引入组件
import Films from '../views/films'
import Cinemas from '../views/cinemas'
import Center from '../views/center'
export default class IndexRouter extends Component {render() {return (//3 使用<HashRouter><Route path="/films" component={Films}></Route><Route path="/cinemas" component={Cinemas}></Route><Route path="/center" component={Center}></Route></HashRouter>)}
}

第三步 在App.js中 引入indexRouter

  • App.js中示例代码
import IndexRouter from './router/indexRouter'
export default function App() {return (<div><IndexRouter></IndexRouter></div>)
}

第四步 在入口文件index.js中渲染页面

  • index.js示例代码
import React from 'react'import ReactDom from 'react-dom/client'import App from './App.js'ReactDom.createRoot(document.querySelector('#root')).render(<App></App>)

2.2 路由的重定向

第一步 引入Redirect

import { HashRouter, Route, Redirect } from 'react-router-dom'

第二步 使用 (模糊匹配)

  • 默认模糊匹配
export default class IndexRouter extends Component {render() {return (//3 使用<HashRouter><Route path="/films" component={Films}></Route><Route path="/cinemas" component={Cinemas}></Route><Route path="/center" component={Center}></Route>{/* 路由的重定向  模糊匹配*/}<Redirect from="/" to="/films"></Redirect></HashRouter>)}
}

2.3 路由Switch组件与404页面

Switch组件

  • 包裹 Route 组件,只会渲染第一个匹配的组件,即使有多个路由都可以匹配成功

    • 在实际开发时,通常会用 Switch 组件包裹 Route 组件
    • 通过 Switch 组件非常容易的就能实现 404 页面功能
  • 需引入

import { HashRouter, Route, Redirect, Switch } from 'react-router-dom'//switch 包裹router标签<Switch><Route path="/films" component={Films}></Route>....中间省略....{/* 404页面 */}<Route component={NotFound}></Route></Switch>

404 页面实现

  • 1.views目录下新建notFound.js
  • 2.路由indexRouter.js中引入
import NotFound from '../views/notFound'
  • 3.使用
<HashRouter>
<Switch><Route path="/films" component={Films}></Route><Route path="/cinemas" component={Cinemas}></Route><Route path="/center" component={Center}></Route>{/* 路由重定向 精确匹配 exact 必须外边用Switch标签包裹	 */}<Redirect from="/" to="/films" exact></Redirect>{/* 404页面 */}<Route component={NotFound}></Route>
</Switch>

2.4 路由嵌套

  • 必须一级路由是模糊匹配!!!
  • 1.新建二级路由页面,并在一级路由页面引入
  • 2.一级路由页面配置路由信息
  • 一级路由示例代码
//引入switch route
import { Switch, Route, Redirect } from 'react-router-dom'//引入
import One from './films/one'
import Two from './films/two'
export default function Films() {return (<div>films<Switch><Route path="/films/one" component={One}></Route><Route path="/films/two" component={Two}></Route>{/* 重定向 */}<Redirect from="/films" to="/films/one"></Redirect></Switch></div>)
}

2.5 声明式导航与编程式导航

2.5.1 声明式导航

通过 a链接 进行跳转

//需加 #<a href="#/center">我的</a>

通过NavLink 进行跳转

//1.引入
import { NavLink } from 'react-router-dom'....<NavLink to="/center">我的</NavLink>

2.5.2 编程式导航

核心代码

import axios from 'axios'
import { useState, useEffect } from 'react'
import { useHistory } from 'react-router-dom'
export default function Tabbar(props) {console.log('打印props', props)let history = useHistory() //将useHistory()钩子赋值给history方便使用const [list, setList] = useState([])useEffect(() => {axios.get('http://localhost:3000/data.json').then((res) => {console.log('接口请求成功', res)setList(res.data.tabs)}).catch((err) => {console.log('接口请求失败', err)})}, [])const toDetails = (id) => {console.log('编程式导航', id)// 原生js 跳转// window.location.href = 'http://localhost:3000/#/cinemas'history.push(`/detail/${id}`)}return (<><h1>编程式导航</h1><ul>{list.map((item, index) => (<li key={item.id} onClick={() => toDetails(item.id)}>{item.name}</li>))}</ul></>)
}

2.6 路由传参

2.6.1 动态路由传参

核心代码

  • 传递参数页面
import axios from 'axios'
import { useState, useEffect } from 'react'
import { NavLink, useHistory } from 'react-router-dom'
export default function Tabbar(props) {console.log('打印props', props)let history = useHistory() //将useHistory()钩子赋值给history方便使用const [list, setList] = useState([])useEffect(() => {axios.get('http://localhost:3000/data.json').then((res) => {console.log('接口请求成功', res)setList(res.data.tabs)}).catch((err) => {console.log('接口请求失败', err)})}, [])const toDetails = (id) => {//1.history.push跳转传参history.push(`/detail/${id}`)}return (<><ul>{list.map((item, index) => (<li key={item.id} onClick={() => toDetails(item.id)}>{item.name}</li>))}</ul></>)
}
  • 路由页面
{/* 详情 :myid接参占位 */}
{/* history.push跳转传参 */}
<Route path="/detail/:myid" component={Detail}></Route>
  • 接参页面
export default function Detail(props) {// history.push跳转传参console.log('详情', props.match.params.myid)return <div>详情页面</div>
}

2.6.2 state传参

  • 传递参数页面
import axios from 'axios'
import { useState, useEffect } from 'react'
import { useHistory } from 'react-router-dom'
export default function Tabbar(props) {console.log('打印props', props)let history = useHistory() //将useHistory()钩子赋值给history方便使用const [list, setList] = useState([])useEffect(() => {axios.get('http://localhost:3000/data.json').then((res) => {console.log('接口请求成功', res)setList(res.data.tabs)}).catch((err) => {console.log('接口请求失败', err)})}, [])const toDetails = (id) => {//state传参history.push({ pathname: '/detail', state: { myid: id } })}return (<><ul>{list.map((item, index) => (<li key={item.id} onClick={() => toDetails(item.id)}>{item.name}</li>))}</ul></>)
}
  • 路由配置
<Route path="/detail" component={Detail}></Route>
  • 接参页面
export default function Detail(props) {//第二种传参console.log('第二种传参', props.location.state.myid)return <div>详情页面</div>

2.7 路由拦截

  • 需求:没有token(未登录) 跳转到登录页面
  • 1.定义函数 用于返回本地是否有token
  isLogin() {console.log('是否登录', localStorage.getItem('token'))return localStorage.getItem('token')}
  • 2.创建登录页 并路由引入配置登录页
 {/* 登录页面 */}<Login path="/login" component={Login}></Login>
  • 3.在需要判断的页面路由上 动态判断
//是否登录 登录跳转至该页面 未登录 重定向登录页面
<Route path="/center" render={() =>this.isLogin() ? <Center /> : <Redirect to="/login"></Redirect>}></Route>

2.8 路由模式

  • 1.哈希模式 路径带# HashRouter
  • 2.BrowserRouter 路径没有# 真正朝后端发请求
//引入BrowserRouter 
import {BrowserRouter as Router,
} from 'react-router-dom'...
//使用
<Router><Switch>...路由...</Switch>
</Router>

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

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

相关文章

基于深度学习的指针式仪表倾斜校正方法——论文解读

中文论文题目:基于深度学习的指针式仪表倾斜校正方法 英文论文题目&#xff1a;Tilt Correction Method of Pointer Meter Based on Deep Learning 周登科、杨颖、朱杰、王库.基于深度学习的指针式仪表倾斜校正方法[J].计算机辅助设计与图形学学报, 2020, 32(12):9.DOI:10.3724…

使用zoom预览出图和系统相机预览出图,画质不一样的问题分析

1、问题背景 最近在基于 Android 的平台调试一款摄像头&#xff0c;客户有反馈一个问题&#xff0c;系统自带的 Camera2 app 预览出图是正常的&#xff0c;但用 Zoom app 打开摄像头&#xff0c;出图画面存在畸变、锯齿、过曝的问题&#xff0c;现象如下图所示。 2、问题分析 …

kafka--kafka基础概念-ISR详解

kafka基础概念-ISR详解 主要是讲 主 往 从同步中的问题 当绿色P1接收到写入的数据&#xff0c;要同步到紫色的P1S1和P1S2 如何保证一致性呢&#xff1f; 使用In Sync Replicas 也就是ISR概念 为什么不一致的&#xff1f; 因为P1S1同步数据 可能花费 50ms P1S2可能花费60ms…

java Spring Boot properties多环境配置拆分文件管理

上文 java Spring Boot yml多环境拆分文件管理优化 我们用yml 做了一个多环境配置文件的拆分管理 我们将 application.yml 改为 application.properties 参考代码如下 spring.profiles.activedev我们知道 yml 是用 : 来区分高低基本 而 properties是直接通过 . 来表达 其他基本…

重新认识小米

被镁光灯聚焦的企业&#xff0c;总是会被贴上各种标签。 8月14日&#xff0c;小米科技创始人雷军以“成长”为主题的年度演讲&#xff0c;刷遍社交网络。提到小米&#xff0c;你首先想到什么&#xff1f;手机发烧友、极致性价比&#xff0c;还是最年轻的500强&#xff1f; 这…

OLED透明屏采购指南:如何选择高质量产品?

着科技的不断进步&#xff0c;OLED透明屏作为一种创新的显示技术&#xff0c;在各个行业中得到了广泛应用。 在进行OLED透明屏采购时&#xff0c;选择高质量的产品至关重要。在这篇文章中&#xff0c;尼伽将为您提供一个全面的OLED透明屏采购指南&#xff0c;帮助您了解关键步…

ArcGIS Pro如何制作不规则形状图例

在默认的情况下&#xff0c;ArcGIS Pro生成的图例是标准的点、直线和矩形的&#xff0c;对于湖泊等要素而言&#xff0c;这样的表示方式不够直观&#xff0c;我们可以将其优化一下&#xff0c;制作不规则的线和面来代替原有图例&#xff0c;这里为大家介绍一下制作方法&#xf…

嵌入式设备应用开发(boost库应用)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 嵌入式开发过程中不可避免在很多情况下,需要使用到posix的api函数。一方面,这些api函数确实可以帮助我们解决一些问题;但是另外一方面,因为平台的差异,如果一段时间不做嵌入式…

No114.精选前端面试题,享受每天的挑战和学习

文章目录 vue3中的ref、toRef、toRefs说明下TS的优缺点说下函数式组件说下函数式编程 vue3中的ref、toRef、toRefs 下面是对Vue 3中的ref、toRef和toRefs进行比较的表格&#xff1a; reftoReftoRefs参数类型值类型或引用类型响应式对象响应式对象返回值Ref 对象Ref 对象响应式…

cmake扩展(5)——file命令排除部分文件

在cmake中可以使用file命令获取需要的文件&#xff0c;并且支持正则/通配符&#xff0c;使用起来还是很方便的。 #语法file({GLOB | GLOB_RECURSE} <out-var> [...] [<globbing-expr>...])#example file(GLOB_RECURSE SOURCES "src/*.h" "src/*.cp…

http库 之 OKHttpUtil

源码位置 方便实用&#xff0c;个人感觉不错 依赖 <dependency><groupId>io.github.admin4j</groupId><artifactId>common-http-starter</artifactId><version>0.7.5</version> </dependency>代码实践 /*** 通用http的pos…

深入理解SSO原理,项目实践使用一个优秀开源单点登录项目(附源码)

深入理解SSO原理,项目实践使用一个优秀开源单点登录项目(附源码)。 一、简介 单点登录(Single Sign On),简称为 SSO。 它的解释是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。 ❝ 所谓一次登录,处处登录。同样一处退出,处处退出。 ❞ 二…

基于ChatYuan-large-v2 微调训练 医疗问答 任务

一、ChatYuan-large-v2 上篇基于ChatYuan-large-v2 语言模型 Fine-tuning 微调训练了广告生成任务&#xff0c;总体生成效果还可以&#xff0c;但上篇文章的训练是微调的模型全部的参数&#xff0c;本篇文章还是以 ChatYuan-large-v2 作为基础模型&#xff0c;继续探索仅训练解…

Centos 8 网卡connect: Network is unreachable错误解决办法

现象1、ifconfig没有ens160配置 [testlocalhost ~]$ ifconfig lo: flags73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopba…

基于HTML+CSS+Echarts大屏数据可视化集合共99套

基于HTMLCSSEcharts大屏数据可视化集合共99套 一、介绍二、展示1.大数据展示系统2.物流订单系统3.物流信息系统4.办税渠道监控平台5.车辆综合管控平台 三、其他系统实现四、获取源码 一、介绍 基于HTML/CSS/Echarts的会议展览、业务监控、风险预警、数据分析展示等多种展示需求…

Python绘制爱心代码(七夕限定版)

写在前面&#xff1a; 又到了一年一度的七夕节啦&#xff01;你还在发愁送女朋友什么礼物&#xff0c;不知道怎样表达你满满的爱意吗&#xff1f;别担心&#xff0c;我来帮你&#xff01;今天&#xff0c;我将教你使用Python绘制一个跳动的爱心&#xff0c;用创意和幽默为这个…

【面试专题】Java核心基础篇②

&#x1f4c3;个人主页&#xff1a;个人主页 &#x1f525;系列专栏&#xff1a;Java面试专题 目录 1.接口和抽象类有什么区别&#xff1f; 2.两个对象的 hashCode() 相同&#xff0c;则 equals()也一定为 true&#xff0c;对吗&#xff1f; 3.说一说hashCode()和equals()的…

机器学习基础之《分类算法(3)—模型选择与调优》

作用是如何选择出最好的K值 一、什么是交叉验证&#xff08;cross validation&#xff09; 1、定义 交叉验证&#xff1a;将拿到的训练数据&#xff0c;分为训练和验证集。以下图为例&#xff1a;将数据分成5份&#xff0c;其中一份作为验证集。然后经过5次(组)的测试&#x…

【简单认识Docker基本管理】

文章目录 一、Docker概述1、定义2.容器化流行的原因3.Docker和虚拟机的区别4.Docker核心概念 二、安装docker三、镜像管理1.搜索镜像2.下载&#xff08;拉取&#xff09;镜像3.查看已下载镜像4.查看镜像详细信息5.修改镜像标签6.删除镜像7.导出镜像文件和拉取本地镜像文件8.上传…