黑马React18: ReactRouter
黑马React: ReactRouter
Date: November 21, 2023
Sum: React路由基础、路由导航、导航传参、嵌套路由配置
路由快速上手
1. 什么是前端路由
一个路径 path 对应一个组件 component 当我们在浏览器中访问一个 path 的时候,path 对应的组件会在页面中进行渲染

2. 创建路由开发环境
# 使用CRA创建项目
npx create-react-app react-router-pro# 安装最新的ReactRouter包
npm i react-router-dom# 启动项目
npm run start
3. 快速开始

import React from 'react'
import ReactDOM from 'react-dom/client'const router = createBrowserRouter([{path:'/login',element: <div>登录</div>},{path:'/article',element: <div>文章</div>}
])ReactDOM.createRoot(document.getElementById('root')).render(<RouterProvider router={router}/>
)
抽象路由模块

路由导航
1. 什么是路由导航
路由系统中的多个路由之间需要进行路由跳转,并且在跳转的同时有可能需要传递参数进行通信

2. 声明式导航
声明式导航是指通过在模版中通过 组件描述出要跳转到哪里去,比如后台管理系统的左侧菜单通常使用这种方式进行
<Link to="/article">文章</Link>
语法说明:通过给组件的to属性指定要跳转到路由path,组件会被渲染为浏览器支持的a链接,如果需要传参直接通过字符串拼接的方式拼接参数即可
3. 编程式导航
编程式导航是指通过 useNavigate 钩子得到导航方法,然后通过调用方法以命令式的形式进行路由跳转,比如想在登录请求完毕之后跳转就可以选择这种方式,更加灵活
语法说明:通过调用navigate方法传入地址path实现跳转
import { Link, useNavigate } from 'react-router-dom'const Login = () => {const navigate = useNavigate()return (<div>我是登陆页{/* 声明式写法 */}<Link to="/article">跳转到文章页</Link>{/* 命令式写法 */}<button onClick={() => navigate('/article')}>跳转到文章页</button></div>)
}export default Login
导航传参

searchParams传参:
src/page/Article/index.js
import { useSearchParams } from "react-router-dom"const Artitlce = () => {const [params] = useSearchParams()const id = params.get('id')const name = params.get('name')return <div>我是文章页 - {id} - {name}</div>
}export default Artitlce
params传参:
src/page/Article/index.js
import { useSearchParams, useParams } from "react-router-dom"const Artitlce = () => {// const [params] = useSearchParams()// const id = params.get('id')// const name = params.get('name')const params = useParams()let id = params.idlet name = params.name// return <div>我是文章页 - {id} - {name}</div>return <div>我是文章页 - {id} - {name}</div>
}export default Artitlce
src/router/index.js
import Login from '../page/Login/index'
import Article from '../page/Article/index'import { createBrowserRouter } from 'react-router-dom'const router = createBrowserRouter([{path: '/login',element: <Login/>},{// path: '/article',path: '/article/:id/:name', // 配置router中的id与nameelement: <Article/>},
])export default router
注意:采用 params 这种方式需要配置一波router
嵌套路由配置
1. 什么是嵌套路由
在一级路由中又内嵌了其他路由,这种关系就叫做嵌套路由,嵌套至一级路由内的路由又称作二级路由,例如:

2. 嵌套路由配置
实现步骤:
-
使用 children属性配置路由嵌套关系
-
使用
<Outlet/>组件配置二级路由渲染位置
Case:
Code:
router/index.js
const router = createBrowserRouter([{path: '/',element: <Layout/>,children: [{path: 'board',element: <Board/>},{path: 'About',element: <About/>}]},{path: '/login',element: <Login/>,},{// path: '/article',path: '/article/:id/:name',element: <Article/>},
])
src/page/Layout/index.js
const Layout = () => {return (<div>我是一级路由layout组件--<Link to="/board">面板</Link>--<Link to="/about">关于</Link>{/* 配置二级路由出口 */}<Outlet></Outlet></div>)
}
Res:

拓展:
路由出口:路径匹配的组件显示的位置
参考:路由出口的基础知识
Vue2:路由
3. 默认二级路由
需求:默认就显示二级路由,比如默认显示面板
当访问的是一级路由时,默认的二级路由组件可以得到渲染,只需要在二级路由的位置去掉path,设置index属性为true

router.js
const router = createBrowserRouter([{path: '/',element: <Layout/>,children: [{index: true, // 默认显示 indexelement: <Board/>},{path: 'About',element: <About/>}]},{path: '/login',element: <Login/>,},{// path: '/article',path: '/article/:id/:name',element: <Article/>},
])
Layout/index.js
这里需要把
import { Outlet, Link } from "react-router-dom"
import Board from "../Board"
import About from "../About"const Layout = () => {return (<div>我是一级路由layout组件--<Link to="/">面板</Link> // 修改原来的 to="/board" 变为 to="/"--<Link to="/about">关于</Link>{/* 配置二级路由出口 */}<Outlet></Outlet></div>)
}export default Layout
4. 404路由配置
场景:当浏览器输入url的路径在整个路由配置中都找不到对应的 path,为了用户体验,可以使用 404 兜底组件进行渲染
实现步骤:
- 准备一个NotFound组件
- 在路由表数组的末尾,以*号作为路由path配置路由
](https://img-blog.csdnimg.cn/5f2614b7beef4e61a8609ce5fea8eed1.png)
page/NotFound
const NotFound = () => {return (<div>this is not found</div>)
}export default NotFound
router/index.js
import Login from '../page/Login/index'
import Article from '../page/Article/index'
import Layout from '../page/Layout'
import About from '../page/About'
import Board from '../page/Board'
import NotFound from '../page/NotFound'import { createBrowserRouter } from 'react-router-dom'const router = createBrowserRouter([{path: '/',element: <Layout/>,children: [{index: true,element: <Board/>},{path: 'About',element: <About/>}]},{path: '/login',element: <Login/>,},{// path: '/article',path: '/article/:id/:name',element: <Article/>},{path: '*',element: <NotFound/>}
])export default router
5. 俩种路由模式
各个主流框架的路由常用的路由模式有俩种,history模式和hash模式, ReactRouter分别由 createBrowerRouter 和 createHashRouter 函数负责创建
| 路由模式 | url表现 | 底层原理 | 是否需要后端支持 |
|---|---|---|---|
| history | url/login | history对象 + pushState事件 | 需要 |
| hash | url/#/login | 监听hashChange事件 | 不需要 |
Code:
history模式
import { createBrowserRouter } from 'react-router-dom'const router = createBrowserRouter([
Res:

hash模式
import { createBrowserRouter, createHashRouter } from 'react-router-dom'const router = createHashRouter([
Res:

相关文章:
黑马React18: ReactRouter
黑马React: ReactRouter Date: November 21, 2023 Sum: React路由基础、路由导航、导航传参、嵌套路由配置 路由快速上手 1. 什么是前端路由 一个路径 path 对应一个组件 component 当我们在浏览器中访问一个 path 的时候,path 对应的组件会在页面中进行渲染 2. …...
算法刷题-动态规划-1
算法刷题-动态规划-1 不同路径不同路径||方法一:方法二 第N个泰波那契数递归写法滚动数组 三步问题递归操作滚动数组 使用最小画法爬楼梯递归 解码方法方法一方法二:(大佬讲解) 不同路径 //机器人不同的路径进入到指定的地点 publ…...
分享一篇很就以前的文档-VMware Vsphere菜鸟篇
PS:由于内容是很久以前做的记录,在整理过程中发现了一些问题,简单修改后分享给大家。首先ESXI节点和win7均运行在VMware Workstation上面,属于是最底层,而新创建的CentOS则是嵌套后创建的操作系统,这点希望…...
QT中的lambda表达式
面是对Qt中在QObject::connect()中的lambda表达式常用用法 QString str("I am a string!"); devicestr; connect(ui- connect(m_imgshowUI, &ImgShow::GetImgPath, m_visionplatform, [](const std::string filename){m_visionplatform->ReadImg(filename);}…...
linux文件I/O:文件锁的概念、函数以及代码实现
文件锁是一种用来保证多个进程对同一个文件的安全访问的机制。文件锁可以分为两种类型:建议性锁和强制性锁。建议性锁是一种协作式的锁,它只有在所有参与的进程都遵守锁的规则时才有效。强制性锁是一种强制式的锁,它由内核或文件系统来强制执…...
MySQL数据库系统教程
目录 基础篇 通用语法及分类 DDL(数据定义语言) 数据库操作 表操作 DML(数据操作语言) 添加数据 更新和删除数据 DQL(数据查询语言) 基础查询 条件查询 聚合查询(聚合函数࿰…...
这样写postman实现参数化,阿里p8都直呼牛逼
什么时候会用到参数化 比如:一个模块要用多组不同数据进行测试 验证业务的正确性 Login模块:正确的用户名,密码 成功;错误的用户名,正确的密码 失败 postman实现参数化 在实际的接口测试中,部分参数…...
【Qt-25】控件篇
一、comboBox控件 1、获取item数量 ui->comboBox_2->count(); 2、根据索引值获取文本 ui->comboBox->itemText(i); 3、调整当前显示文本内容 ui->comboBox->setCurrentIndex(j); 4、添加item ui->comboBox->addItem("");//添加一个内…...
《算法通关村——反转字符串中的单词问题解析》
《算法通关村——反转字符串中的单词问题解析》 151. 反转字符串中的单词 给你一个字符串 s ,请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接…...
C++使用Tensorflow2.6训练好的模型进行预测
要在C语言中调用训练好的TensorFlow模型,需要使用TensorFlow C API。 https://tensorflow.google.cn/install/lang_c?hl=zh-cnten TensorFlow 提供了一个 C API,该 API 可用于为其他语言构建绑定。该 API 在 c_api.h 中定义,旨在实现简洁性和一致性,而不是便利性。 下载…...
5-1 Java 网络编程
第1关:URL类与InetAddress类 任务描述 本关任务:了解网络编程基础知识。 相关知识 为了完成本关任务,你需要掌握:1.URL;2.InetAddress。 URL 统一资源定位符(Uniform Resource Locator,缩…...
汇编-CALL和RET指令
CALL指令调用一个过程, 使处理器从新的内存位置开始执行。过程使用RET(从过程返回) 指令将处理器转回到该过程被调用的程序点上。 CALL指令的动作: 1.将CALL指令的下一条指令地址压栈(作为子过程返回的地址) 2.将被调过程的地址复制到指令指针寄存器E…...
STM32_5(中断)
中断系统 中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行中断优先级:当…...
docker 部署hbase 并且java Api连接
首先先运行容器 docker run -d --name hbase -p 2181:2181 -p 16010:16010 -p16000:16000 -p 16020:16020 -p 16030:16030 harisekhon/hbase2.在本机的hosts中注册docker的id 因为docker内部集成了其他环境而其他环境 中的ip是docker id 所以需要在hosts中转换 192.168.80.120…...
EasyExcel listener无法通过Autowired注入xxMapper
easyexcel listener无法通过Autowired注入xxMapper 文章目录 easyexcel listener无法通过Autowired注入xxMapperbug记录:解决方案:easyexcel 使用例子controllerServiceImpllistener bug记录: productMapper注入一直为null,而procureDetailM…...
Android Spannable 使用注意事项
1、当前示例中间的 "评论",使用SpannableStringBuilder实现,点击评论会有高亮效果加粗,但再点击其它Bar时无法恢复默认样式。 2、因为SpannableString或SpannableStringBuilder中的效果是叠加的,恢复默认样式需要先移除…...
Apache访问控制
服务器相关的访问控制 Options指令 Options指令是Apache服务器配置文件中的一个重要指令,它可以用于控制特定目录启用哪些服务器特性。Options指令可以在Apache服务器的核心配置、虚拟主机配置、特定目录配置以及.htaccess文件中使用。 以下是一些常用的服务器特性选项: N…...
二、类与对象(二)
8 this指针 8.1 this指针的引入 我们先来定义一个日期的类Date: #include <iostream> using namespace std; class Date { public:void Init(int year, int month, int day){_year year;_month month;_day day;}void Print(){cout << _year <&l…...
Pytorch从零开始实战10
Pytorch从零开始实战——ResNet-50算法实战 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——ResNet-50算法实战环境准备数据集模型选择开始训练可视化模型预测总结 环境准备 本文基于Jupyter notebook,使用Python3.8,…...
设计模式-单例模式实战
目录 一、引言二、适用场景三、代码实战饿汉式单例模式懒汉式单例模式双重检查锁定单例模式静态内部类单例模式 四、实际应用举例Runtime解析 五、结论 一、引言 单例模式是一种创建型设计模式,用于确保一个类只有一个实例,且提供全局访问点以访问该实例…...
第二篇:为什么现在是 Vibe Coding 的元年?风险与挑战
技术变革不是偶然,而是一系列突破的临界点。同时,任何新范式都暗藏陷阱。引子:为什么不是五年前? 你可能好奇:自然语言生成代码的想法并不新鲜。早在 2015 年,就有研究用 LSTM 生成简单的 SQL 语句。为什么…...
告别选型纠结!一文看懂RK3588与RK3588S的五大核心差异,帮你选对核心板
RK3588与RK3588S深度对比:从芯片选型到产品落地的实战指南 在智能硬件开发领域,芯片选型往往决定了产品的性能上限和成本结构。面对Rockchip推出的两款旗舰级处理器RK3588和RK3588S,许多开发者都会陷入选择困难。这两款芯片看似同源ÿ…...
手把手教你搞定KBS投稿:Overleaf配置、文件清单与审稿回复模板分享
KBS投稿全流程技术指南:从Overleaf配置到审稿回复的工程化实践 第一次在Knowledge-Based Systems(KBS)投稿时,我像大多数研究者一样,被复杂的文件准备和格式要求弄得手忙脚乱。直到第三次投稿后,才意识到学…...
终极跨语言语义搜索解决方案:paraphrase-multilingual-MiniLM-L12-v2完全指南
终极跨语言语义搜索解决方案:paraphrase-multilingual-MiniLM-L12-v2完全指南 【免费下载链接】paraphrase-multilingual-MiniLM-L12-v2 项目地址: https://ai.gitcode.com/hf_mirrors/ai-gitcode/paraphrase-multilingual-MiniLM-L12-v2 在全球化数字时代&…...
AI专著写作神器!一键生成20万字专著,解决写作难题!
学术专著创作困境与AI工具解决方案 对于许多学者来说,创作学术专著时遇到的最大挑战,莫过于“有限时间”与“无尽期望”的矛盾。编写专著常常需要三到五年,甚至更长的时间,而研究者还需承担教学、项目研究和学术交流等多重责任&a…...
WSL2环境下实现OpenClaw AI助手跨系统桌面截图技能
1. 项目概述与核心价值 如果你和我一样,日常主力开发环境是 Windows 11 上的 WSL2,同时又重度依赖像 OpenClaw 这类 AI 智能体来处理一些自动化任务,那你可能也遇到过这个痛点:当 AI 助手跑在 WSL 的 Linux 环境里时,它…...
电力电子仿真避坑指南:Simulink三相可编程电压源Y型联结的相电压与线电压设置误区
电力电子仿真避坑指南:三相可编程电压源Y型联结的相电压与线电压设置误区 在电力电子仿真中,三相可编程电压源是最基础的模块之一,但也是最容易设置错误的环节。许多初学者在搭建逆变器、变频器或并网仿真时,常常因为对Y型联结的相…...
戴尔G15终极散热控制:如何解锁笔记本性能的完整指南?
戴尔G15终极散热控制:如何解锁笔记本性能的完整指南? 【免费下载链接】tcc-g15 Thermal Control Center for Dell G15 - open source alternative to AWCC 项目地址: https://gitcode.com/gh_mirrors/tc/tcc-g15 还在为游戏本过热降频而烦恼吗&am…...
ViGEmBus虚拟设备驱动核心实现方案解析
ViGEmBus虚拟设备驱动核心实现方案解析 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus ViGEmBus是Windows内核模式驱动,通过完全软件方式模拟USB…...
蓝牙耳机和手机的具体蓝牙通信流程
蓝牙耳机和手机通信,不是只有一条“蓝牙连接”这么简单。实际上一副耳机和手机之间通常会同时跑好几个协议/通道: 1. 经典蓝牙 BR/EDR:用来传音乐、通话、播放控制A2DP / AVRCP / HFP2. BLE 低功耗蓝牙:用来做弹窗、配套 App 控制…...
