【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容器关闭时触发,初始化的步骤比较…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
