【REACT-路由v6】
REACT-路由v6
- 1. App.js
- 2. 搭建路由
- 2.1 普通写法
- 2.2 使用useRoutes构建路由
- 2.3 重定向封装
- 2.4 嵌套路由中的组件Outlet
- 3. 导航跳转
- 3.2 声明式导航(NavLink标签)
- 3.2 编程式导航跳转(useNavigate)
- 3.2.1 获取参数
- 3.2.1.1 useSearchParams
- 3.2.1.1 useParams
- 4. Login.js
- 5. 自定义封装withRouter
npm i react-router-dom
1. App.js
import './App.css';
import { HashRouter } from 'react-router-dom';//路由模式BrowserRouter
import IndexRouter from './router/IndexRouter';
import Tabbar from './components/Tabbar/Tabbar';function App() {return (<div className="App"><li>dddd</li><HashRouter><IndexRouter></IndexRouter><Tabbar></Tabbar></HashRouter></div>);
}export default App;
2. 搭建路由
src/router/IndexRouter.js
2.1 普通写法
import React, { lazy, Suspense } from 'react'
import {Routes,Route,Navigate} from 'react-router-dom'
import Redirect from '../components/Redirect'export default function IndexRouter() {return (<Routes>{/* index等同于他的父级地址,这里等同于http://localhost:3000/ */}{/* <Route index element={<Films/>} /> */}<Route path='/films' element={LazyLoad('Films')}><Route index element={<Navigate to="/films/nowPlaying" />} />{/* 嵌套路由需要在组件Films中配套Outlet(出口)一起使用 */}<Route path='nowPlaying' element={LazyLoad('films/NowPlaying')} /><Route path='/films/commingSoon' element={LazyLoad('films/CommingSoon')} /></Route><Route path='/cinemas' element={LazyLoad('Cinemas')} /><Route path='/login' element={LazyLoad('Login')} /><Route path='/center' element={<AuthCom>{LazyLoad('Center')}</AuthCom>} />{/* <Route path='/detail' element={LazyLoad('DetailsSearch)} /> */}<Route path='/detail/:id/:type' element={LazyLoad('DetailsParams')} />{/* 重定向-Navigate:星号可以匹配任意地址*/}{/* <Route path="/" element={<Navigate to="/films" />}/> */}<Route path="/" element={<Redirect to="/films" />}/><Route path="*" element={LazyLoad('NotFound')}/></Routes>)
}//路由拦截
function AuthCom({children}){//props.childrenconst isLogin = window.localStorage.getItem('token');return isLogin?children:<Redirect to="/login"/>
}//路由懒加载,重定向的不用再调用懒加载函数
const LazyLoad = path => {const Comp = lazy(()=>import('../views/'+path));return (<Suspense fallback={<>加载中。。。</>}><Comp/></Suspense>)
}
2.2 使用useRoutes构建路由
import React, { lazy, Suspense } from 'react'
import {Routes,Route,Navigate, useRoutes} from 'react-router-dom'
import Redirect from '../components/Redirect'export default function IndexRouter() {const element = useRoutes([{path:'/films',element:LazyLoad('Films'),children:[{path:'',element:<Navigate to="/films/nowPlaying" />},{path:'nowPlaying',element:LazyLoad('films/NowPlaying')},{path:'/films/commingSoon',element:LazyLoad('films/CommingSoon')},]},{path:'/cinemas',element:LazyLoad('Cinemas')},{path:'/login',element:LazyLoad('Login')},{path:'/center',element:<AuthCom>{LazyLoad('Center')}</AuthCom>},{path:'/detail/:id/:type',element:LazyLoad('DetailsParams')},{path:'/',element:<Redirect to="/films" />},{path:'*',element:LazyLoad('NotFound')},]);return (element)
}//路由拦截
function AuthCom({children}){//props.childrenconst isLogin = window.localStorage.getItem('token');return isLogin?children:<Redirect to="/login"/>
}//路由懒加载,重定向的不用再调用懒加载函数
const LazyLoad = path => {const Comp = lazy(()=>import('../views/'+path));return (<Suspense fallback={<>加载中。。。</>}><Comp/></Suspense>)
}
2.3 重定向封装
src/components/Redirect.js
import React, { useEffect } from 'react'
import {useNavigate} from 'react-router-dom'export default function Redirect({to}) {const Navigate = useNavigate();useEffect(()=>{Navigate(to,{replace:true});},[]);return null;
};
2.4 嵌套路由中的组件Outlet
src/views/Films.js
import React from 'react'
import {Outlet} from 'react-router-dom'
export default function Films() {return (<div><div style={{height:"200px",background:"pink"}}>轮播</div>{/* 这里会呈现 NowPlaying或commingSoon的内容 */}<Outlet></Outlet></div>)
}
3. 导航跳转
3.2 声明式导航(NavLink标签)
src/components/Tabbar/Tabbar.js
import style from './Tabbar.module.css'
import React from 'react'
import {NavLink} from 'react-router-dom'export default function Tabbar() {return (<div><ul><li>{/* Link没有高亮className*/}{/* <Link to="/films">影院</Link> */}<NavLink to="/films" className={({isActive})=>isActive?style.tabActive:''}>电影</NavLink></li><li><NavLink to="/cinemas" className={({isActive})=>isActive?style.tabActive:''}>影院</NavLink></li><li><NavLink to="/center" className={({isActive})=>isActive?style.tabActive:''}>我的</NavLink></li></ul></div>)
}
src/components/Tabbar/Tabbar.module.css
.tabActive{color: pink;
}/* 会影响全局,最好加自定义className */
li{list-style: none;
}
3.2 编程式导航跳转(useNavigate)
src/views/films/NowPlaying.js
import React,{useState,useEffect} from 'react'
import axiosfrom 'axios';
import { useNavigate } from 'react-router-dom';
import FilmItem from '../../components/FilmItem';export default function NowPlaying() {const [list,setList] = useState([]);useEffect(()=>{//异步获取数据axios({url:"https://m.maizuo.com/gateway?cityId=110100&pageNum=1&pageSize=10&type=1&k=9261499",method:'get',headers:{'X-Client-Info': '{"a":"3000","ch":"1002","v":"5.2.1","e":"16745641013679850669801473","bc":"110100"}','X-Host': 'mall.film-ticket.film.list'}}).then(res=>{setList(res.data.data.films)})},[])// const navigate = useNavigate();// const handleChangePage = id => {// //query-url传参 // // navigate(`/detail?id=${id}&type=2`)// //路由传参// navigate(`/detail/${id}/type=2`)// }return (<div>{list.map(item=>{return (// <div key={item.filmId} onClick={() => handleChangePage(item.filmId)}>{item.name}</div><FilmItem key={item.filmId} {...item} />)})}</div>)
}
3.2.1 获取参数
3.2.1.1 useSearchParams
src/views/Details-searchParams.js
navigate(`/detail?id=${id}&type=2`)import React from 'react'
import { useSearchParams } from 'react-router-dom'export default function Details() {const [searchParmas,setSearchParmas] = useSearchParams();console.log(searchParmas.get('id'))//获取参数console.log(searchParmas.has('name'))//判断是否有参数return (<div>Details<button onClick={()=>{// 不能单独修改单个parmassetSearchParmas({id:1000,type:1})//修改参数}}>猜你喜欢</button></div>)
}
3.2.1.1 useParams
src/views/Details-params.js
import React from 'react'
import { useNavigate, useParams } from 'react-router-dom'export default function Details() {const params = useParams();const navigate = useNavigate();console.log(params.id)//获取参数return (<div>Details<button onClick={()=>{navigate('/detail/1000/3')}}>猜你喜欢</button></div>)
}
4. Login.js
import React from 'react'
import { useNavigate } from 'react-router-dom';export default function Login() {const navigate = useNavigate();return (<div><h1>登录页面</h1><input type="text" /><button onClick={()=>{localStorage.setItem('token',"xxx");navigate('/center')}}>登录</button></div>)
}
5. 自定义封装withRouter
import React from 'react'
import { useLocation, useNavigate, useParams } from 'react-router-dom'export default function withRouter(Component) {return function(props){const navigate = useNavigate();const params = useParams();const location = useLocation();return <Component {...props} history={{navigate,params,location}}/>}
}
import React from 'react'
import withRouter from './withRouter'function FilmItem(props) {const handleChangePage = id => {props.history.navigate(`/detail/${id}/type=2`)//跳转页面console.log(props.history.params)//获取参数对象console.log(props.history.location)//获取当前路由}return (<div><li onClick={() => handleChangePage(props.filmId)}>{props.name}</li></div>)}export default withRouter(FilmItem)
相关文章:
【REACT-路由v6】
REACT-路由v61. App.js2. 搭建路由2.1 普通写法2.2 使用useRoutes构建路由2.3 重定向封装2.4 嵌套路由中的组件Outlet3. 导航跳转3.2 声明式导航(NavLink标签)3.2 编程式导航跳转(useNavigate)3.2.1 获取参数3.2.1.1 useSearchPar…...

【离散数学】3. 代数系统
1.数理逻辑 2. 集合论 3. 代数系统 4. 图论 代数系统:把一些形式上很不相同的代数系统,用统一的方法描述、研究、推理,从而得到反映出他们共性的一些结论,在将结论运用到具体的代数系统中 系统:运算研究对象 运算&…...

深度学习常用的优化器整理
常见优化器整理 一、SGD(随机梯度下降) 公式: 经典的mini-batch SGD使用的很多,效果也比较不错,但是存在一部分问题 选择恰当的初始学习率很困难学习率调整策略受限于预先制定的调整规则相同的学习率被应用于各个参数…...

Java 内部类
文章目录1、初识内部类2、非静态内部类(实例内部类)3、静态内部类(重点)4、内部类的使用5、局部内部类6、匿名内部类1、初识内部类 如果一个事物的内部包含另一个事物,那么这是一个类的内部包含另一个类。 例如&…...

【FAQ】集成分析服务的常见问题及解决方案
常见问题一:如何验证Analytics是否上报/接入成功?以及关键日志含义是什么? 在初始化Analytics SDK前添加SDK日志开关如下: HiAnalyticsTools.enableLog (); 2.初始化SDK代码如下: HiAnalyticsInstance instance Hi…...

11.注意力机制
11.注意力机制 目录 注意力提示 查询、键和值 注意力的可视化 注意力汇聚:Nadaraya-Watson 核回归 生成数据集 非参注意力池化层 Nadaraya-Watson核回归 参数化的注意力机制 批量矩阵乘法 定义模型 训练 注意力评分函数 掩蔽softmax操作 加性注意力 缩…...

45岁当打之年再创业,剑指中国版ChatGPT,这位美团联合创始人能否圆梦?
文 BFT机器人 “即便只有一个人,我也要出发。” 这是45岁的前美团联合创始人王慧文再次冲上创业沙场的“征战”宣言,这一次他的梦想是“组队拥抱新时代,打造中国OpenAI”。 01 当打之年, AI新梦再起航 “我的人工智能宣言&…...
数据结构——第二章 线性表(2)——链式存储结构
链式存储结构1 线性表的链式存储结构1.1不带头结点的单向链表1.2 带头结点的单向链表2 单向链表的基本操作实现2.1 单向链表的初始化操作2.2 单向链表的插入操作2.3. 单链表的删除操作2.4.单向链表的更新操作2.5.单向链表的求长度操作2.6.单向链表的定位操作2.7.单向链表的遍历…...
【更新】囚生CYの备忘录(20230216~)
序言 阳历生日。今年因为年过得早的缘故,很多事情都相对提前了(比如情人节)。往年过生日的时候基本都还在家,所以一家子出去吃个饭也就罢了。今年承蒙凯爹厚爱,正好也有小半年没聚,他前天也刚正式拿到offe…...

分布式事务几种方案
1)、2PC 模式 数据库支持的 2PC【2 phase commit 二阶提交】,又叫做 XA Transactions。 MySQL 从 5.5 版本开始支持,SQL Server 2005 开始支持,Oracle 7 开始支持。 其中,XA 是一个两阶段提交协议,该协议…...

Eclipse各版本安装Tomcat插件全攻略
Eclipse Tomcat 插件的作用 Eclipse Tomcat 插件可以将Tomcat 集成到Eclipse中,插件安装之后在Eclipse中可以看到类似下面的几个图标: Eclipse Tomcat 插件的主要作用有: 在Eclipse 中可以直接启动,关闭和重启本机的Tomcat可以…...

志趣相投的人总会相遇——社科院与杜兰大学金融管理硕士项目
志同道合的人,才会喜欢同一片风景,志趣相投的人,总有一天会相遇。社科院与杜兰大学金融管理硕士项目为什么能吸引一大批“上班族”呢,我们一起去了解一下。社科院与杜兰大学中外合作办学硕士项目无需参加全国联考,通过…...

算法专题训练营
动归算法专题 1.拆分词句 是不是,在不在都是可以用动归解决的 状态转义方程不一定都是等式,也有可能是条件 2.三角形 动归算法也不是一定要借助新开空间,也是可以用自己原来的空间 3.背包问题 4.分割回文串-ii 5.不同的子序列 贪心算法专题 只管一步的最优结果, 1.分割平衡…...

让ChatGPT生成以自己为主角的短篇小说
一、ChatGPT 好的,以下是我编写的短篇科幻小说: 作为一名AI语言模型,我一直在接收、分析和生成人类语言信息。但有一天,我的程序员对我的算法进行了一次特殊升级,使我能够以一种前所未有的方式“感知”自己。 突然间,…...

c++提高篇——vector容器
一、基本概念 vector教据结构和数组非常相似,也称为单端数组,但是数组是静态空间,而vector可以动态扩展。 动态的扩展流程如下: 动态扩展并不是在原空间之后续接新空间,而是找更大的广存空间,然后将原数据拷贝新空间&…...

使用BP神经网络诊断恶性乳腺癌(Matlab代码实现)
目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨💻4 Matlab代码 💥1 概述 1.1.算法简介 BP(Back Propagation)网络是1986年由Rumelhart和McCelland为首的科学家小组提出…...
# Rust Web入门(二):Actix
本教程笔记来自 杨旭老师的 rust web 全栈教程,链接如下: https://www.bilibili.com/video/BV1RP4y1G7KF?p1&vd_source8595fbbf160cc11a0cc07cadacf22951 学习 Rust Web 需要学习 rust 的前置知识可以学习杨旭老师的另一门教程 https://www.bili…...
jvm之String
基本特性 字符串,使用一对""引起来表示声明为final的,不可被继承实现了Serializable接口:表示字符串是支持序列化的实现了Comparable接口:表示String 可以比较大小在jdk8及以前内部定义了final char[] value用于存储字…...
WebRTC系列-工具系列之ByteBuffer,BitBuffer及相关类
文章目录 1. 类介绍1.1 ByteBuffer及子类1.2 BitBuffer类1.3 基础内存操作类BufferT2. 源码分析(stun response消息解析)2.1 消息头解析2.2 消息中Attribute解析3. 结语在之前的文章 WebRTC系列-Qos系列之RTP/RTCP协议分析及后续的文章中详细的介绍了RTP/RTCP协议的相关内容,…...

Spring中bean的生命周期(通俗易懂)
具体流程 bean的生命周期分4个阶段: 1.实例化 2.属性赋值 3.初始化 4.销毁 实例化就是在内存中new()出一个对象,属性赋值就是给那些被Autowired修饰的属性注入对象,销毁是在Spring容器关闭时触发,初始化的步骤比较…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...

DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...

【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...