React小记(四)_路由的基本使用

react-router V6

1、React-router 的三个版本

    1、React-router 服务端使用2、React-router-dom 浏览器端使用3、React-router-native React-native 混合开发使用

2、基本使用

    基本使用步骤如下:1、选择路由模式 history/hash 包裹在想要使用路由的组件外面包裹的好处是灵活,谁用包裹谁2、使用 Routes 组件 --- 路由出口3、使用 Route 组件 --- 写在 Routes 里面(用来包裹具体路由规则)4、使用 NavLink/Link 组件 --- 路由链接

2.1 选择路由模式

    // 1、用哪包哪<BrowserRouter><App /></BrowserRouter>// 2、用谁包谁<HashRouter><App /></HashRouter>

2.2 定义路由组件

    在 src 新建文件夹 pages 里面用来放 路由组件
import '../App.css';function Page1() {return (<div className="App"><h3>Page1</h3></div>);
}export default Page1;

2.3 路由出口以及配置路由规则

import './App.css';
// 1、引入路由组件 以及 Routes, Route
import {Routes, Route} from 'react-router-dom';
import Page1 from './pages/page1';
import Page2 from './pages/page2';
import Page3 from './pages/page3';
import Page4 from './pages/page4';function App() {return (<div className="App"><h2>路由的基本使用</h2>{/* 2、注明路由出口 配置路由规则 */}<Routes>{/* path 这里 不要写成 './' */}{/* 写法一: Component 里面直接写组件名 */}<Route path='/page1' Component={Page1}></Route>{/* 写法二:element 里面写组件 */}<Route path='/page2' element={<Page2></Page2>}></Route><Route path='/page3' element={<Page3></Page3>}></Route>{/* path 这里 可以写成 字符串 也可以用{}包裹 */}<Route path={'/page4'} element={<Page4></Page4>}></Route></Routes></div>);
}export default App;

2.4 声明路由链接

    1、NavLink 自带 active 类, 使用时需要在样式文件中添加 active 类2、Link 普通的链接
// 引入
import {NavLink,Link} from 'react-router-dom';// 使用 路由链接
<div style={{ display: 'flex', justifyContent:'center'}}>{/* 1、NavLink 选中后自带 active 类 添加样式即可使用 */}<NavLink to={"/page1"}>Page1</NavLink><NavLink to={"/page2"}>Page2</NavLink>{/* 2、普通的链接 */}<Link to={"/page3"}>Page3</Link><Link to={"/page4"}>Page4</Link>
</div>// 添加 active 类
.active{background-color: #61dafb;border-radius: 20%;
}

3、感受 react 全局插件 使用方式

    1、与 vue 不同 ,react 中没有 vue.use 的方法2、使用时,都是遵循 `谁使用,包裹谁` 的原则

4、嵌套路由 与 outLet

    1、在当前 Route 组件下,在嵌套 Route 组件2、使用 outLet 组件 在当前组件 注明 路由出口3、在 当前组件 中 写路由链接 实现点击跳转

4.1 重新配置路由规则

// 引入子组件
import Son1 from './pages/page1Son/Son1';
import Son2 from './pages/page1Son/Son2';<Route path='/page1' Component={Page1}><Route path='son1' element={<Son1></Son1>}></Route><Route path='son2' element={<Son2></Son2>}></Route>
</Route>

4.2 使用 outLet 组件

import { Outlet } from 'react-router-dom';<div><h4>子页面的位置</h4>{/* 用于告诉 路由 子组件显示的位置 */}<Outlet/>
</div>

4.3 实现点击跳转

import {Link} from 'react-router-dom';<div><Link to={"/page1/son1"}>son1</Link><Link to={"/page1/son2"}>son2</Link>
</div>

5、动态路由 与 路由传参

    1、动态路由就是配置路由时,路由规则的 path 是不固定的,往往携带着一些参数2、react中常见的路由参数有以下几种(1) params 参数 --类似于 get 请求V5  this.props.match.paramsV6  useParams(2) query 参数 -- 类似于 get 请求V5  this.props.location.searchV6  useSearchParams(3) location信息 / state 参数  -- 参数通过 state 属性 传递(类似于 post 请求)V5  this.props.location.stateV6  useLocation

5.1 params 参数

    1、路由链接(携带参数)<NavLink to={"/page2/3"}>Page2</NavLink>2、注册路由(声明接收)--加占位符:<Route path='/page2/:id' element={<Page2></Page2>}></Route>3、接收参数:V5 this.props.match.paramsV6 const parms = useParams()
import '../App.css';
import {useParams} from 'react-router-dom';function Page2() {// 接收 params 参数const parms = useParams()return (<div className="App"><h3>Page2</h3><p>携带的params参数:{ parms.id}</p></div>);
}export default Page2;

5.2 query 参数

    1、路由链接(携带参数)<Link to={"/page3?name='张三'&age=18"}>Page3</Link>2、注册路由(声明接收)--无需变动:<Route path="/page3" element={<Page3></Page3>}></Route>3、接收参数:V5 this.props.location.searchV6 const [query,setQuery] = useSearchParams()
import '../App.css';
import {useSearchParams} from 'react-router-dom'function Page3() {const [query,setQuery] = useSearchParams()return (<div className="App"><h3>Page3</h3>{/* 1、query.get 获取参数 */}<p>接收到的query参数:name:{query.get('name')} age:{query.get('age')}</p>{/* 2、setQuery 修改参数 是替换 不是追加 */}<button onClick={()=>{setQuery({name:'李四',age:'19'})}}>修改query参数</button></div>);
}export default Page3;

5.3 state 参数

V51、路由链接(携带参数)<Link to={{pathname:'/demo/test',state:{name:'tom',age:18}}}>详情</Link>2、注册路由(无需声明,正常注册即可)<Route path="/demo/test" component={Test}/>3、接收参数:this.props.location.state4、备注:刷新也可以保留住参数
【V61、路由链接(携带参数)<Link to={"/page4?name='张三'&age=18"} state={{ name: '赵六', age:'20'}}>Page4</Link>2、注册路由(无需声明,正常注册即可)<Route path={'/page4'} element={<Page4></Page4>}></Route>3、接收参数:const { state, search} = useLocation()4、备注:刷新也可以保留住参数
import '../App.css';
import { useLocation } from 'react-router-dom'
import query from 'querystring'function Page4() {const { state, search} = useLocation()return (<div className="App"><h3>Page4</h3><p>接收的state参数:name:{state.name}age{state.age}</p><p>也可以从这里取query参数:{/* 这里取到的参数为字符串 需要借助第三方库解析成对象 然后取值 */}name:{query.parse(search).name}age:{query.parse(search).age}</p></div>);
}export default Page4;

6、重定向

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

7、编程式路由导航

【V5】借助【this.prosp.history】对象上的API对操作路由跳转、前进、后退-this.prosp.history.push()-this.prosp.history.replace()-this.prosp.history.goBack()-this.prosp.history.goForward()-this.prosp.history.go()
【V6】1、使用 useNavigate 创建跳转方法 ,然后跳转2、如何传参parms/query 参数 直接写在路径上state 参数 写在 第二个参数上

【案例】实现从page2 跳转到 page1 并携带 state参数

// page2
import '../App.css';
import {useParams, useNavigate} from 'react-router-dom';function Page2() {// 接收 params 参数const parms = useParams()// 编程式路由const nav = useNavigate()return (<div className="App"><h3>Page2</h3><p>携带的params参数:{parms.id}</p><button onClick={() => {nav('/page1', {state: { demo: "测试编程式路由导航" }})}}>跳转到page1</button></div>);
}export default Page2;// page1
import '../App.css';
import {Link} from 'react-router-dom';
import { Outlet,useLocation } from 'react-router-dom';function Page1() {const { state } = useLocation()console.log(state);return (<div className="App"><h3>Page1</h3><div><Link to={"/page1/son1"}>son1</Link><Link to={"/page1/son2"}>son2</Link></div><div><h4>子页面的位置</h4><p>从page2携带过来的参数class:{state.demo}</p>{/* 用于告诉 路由 子组件显示的位置 */}<Outlet/></div></div>);
}export default Page1;

8、路由懒加载

    1、lazy Suspence 实际上是 react 的函数/组件 用的时候将内容包一下2、react 其他函数 使用规则亦是如此3、主要目的是用的组件才导入,对大型项目【打包】友好
// 1、路由表中引入方式变为 lazy
const Home = lazy(() => import('../pages/Home'))
const Login = lazy(()=>import('../pages/Login'))// 2、使用路由组件的页面 展示时 引入 Suspence(组件)搭配使用
import {Suspense} from 'react'<Suspense><App/>
</Suspense>

9、路由表的使用

    1、路由表 就是在外部再次创建一个数组文件 将配置信息填入2、借助 useRoutes 根据路由表 渲染 路由出口  

9.1 配置路由表

// route.js
import About from "../pages/About";
import Home from "../pages/Home";
import { Navigate } from "react-router-dom"export default [{path: "/home",element: <Home />},{path: "/about",element: <About />},{// 路由的重定向 当访问某个路径时  替换成另外一个路径path: "/",element: <Navigate to={"about"} />},
]

9.2 借助 useRoutes 根据路由表 渲染 路由出口

import { Link, useRoutes } from "react-router-dom"
import routes from "./routes"function App() {// 1、借助 useRoutes 根据路由表 渲染 路由出口 -- elementlet element = useRoutes(routes)return (<div><h1>我是App组件</h1><div><Link to={"/home"}>首页</Link><Link to={"/about"}>关于</Link></div><hr /><div>{/* 2、路由表 渲染的 路由出口 */}{element}</div></div>)
}export default App
```js

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

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

相关文章

ONLYOFFICE 8.1版本桌面编辑器测评:超越想象的办公体验!

在当今数字化办公时代&#xff0c;一个功能强大、操作便捷的办公套件对于提高工作效率至关重要。ONLYOFFICE 8.1作为一款备受瞩目的办公软件&#xff0c;凭借其全面的功能、优异的性能和出色的用户体验&#xff0c;为用户带来了超越想象的办公体验。下面&#xff0c;我们将对ON…

SHELL/2024/6/26

1.统计家目录下.c文件的个数 #!/bin/bash count0 for filename in $(ls ~ *.c) do ((count)) done echo count$count 2.终端输入一个.sh文件&#xff0c;判断文件是否具有可执行权限/然后运行脚本&#xff0c;没有可执行权限&#xff0c;添加可执行权运行脚本 #!/bi…

ue 材质贴图Tiling repeat

材质问题&#xff0c;如下 贴图显然不符合逻辑&#xff0c;太大&#xff0c;并且是一次性贴图 换一个红砖纹理&#xff0c;就看清了&#xff0c;砖太大了 修改&#xff1a; 拖出一个TexCoord&#xff0c;代表坐标&#xff0c;拖出一个参数&#xff0c;代表次数&#xff0c;如…

6.22套题

B. Dark 题意&#xff1a;每次能在数列中能使相邻两个数-1&#xff0c;求当数列没有连续非0值的最小贡献 解法:设表示前i个数中前i-1个数是否为0&#xff0c;当前数是j的最小贡献。表示i1以后减掉d的最小贡献。 C. 幸运值 D. 凤凰院真凶

什么是区块链?——从零开始的区块链入门指南

在这个信息爆炸的时代&#xff0c;区块链这个词儿已经成了热词儿。那么&#xff0c;区块链到底是啥玩意儿呢&#xff1f;别急&#xff0c;今天咱们就从头开始&#xff0c;给你掰扯掰扯区块链的来龙去脉&#xff0c;让你轻松入门。 一、区块链的定义 想象一下&#xff0c;区块…

视觉分割的定义与性能度量

文章目录 视觉分割的定义语义分割(Semantic Segmentation)实例分割(instance Segmentation)全景分割(Panoptic Segmentation)视频语义分割(Video Semantic Segmentation)视频实例分割(Video instance Segmentation)视频全景分割(Video Panoptic Segmentation)各任务对比 视觉分…

云计算【第一阶段(21)】引导过程与服务控制

目录 一、linux操作系统引导过程 1.1、开机自检 1.2、MBR引导 1.3、GRUB菜单 1.4、加载 Linux 内核 1.5、init进程初始化 1.6、简述总结 1.7、初始化进程centos 6和7的区别 二、排除启动类故障 2.1、修复MBR扇区故障 2.1.1、 实验 2.2、修复grub引导故障 2.2.1、实…

基于redisson实现tomcat集群session共享

目录 1、环境 2、修改server.xml 3、修改context.xml 4、新增redisson配置文件 5、下载并复制2个Jar包到Tomcat Lib目录中 6、 安装redis 7、配置nginx负载均衡 8、配置测试页面 9、session共享测试验证 前言&#xff1a; 上篇中&#xff0c;Tomcat session复制及ses…

【UE5.3】笔记3-静态网格体,BSP

静态网格体组件 主要有两个属性 一个是静态网格体&#xff1a;对应的也就是模型&#xff0c;比如fbx&#xff0c;maya&#xff0c;obj等格式 一个是材质&#xff1a;由各种贴图、渲染设置等&#xff0c;比如unity里的shader BSP画刷&#xff1a; 打开放置Actor选项卡&#…

pandas 查看数据集中某个特征(列)为 NA 的所有行

要查看数据集中某个特征&#xff08;列&#xff09;为 NA 的所有行&#xff0c;可以使用 Pandas 库中的 isna() 或 isnull() 函数来识别缺失值&#xff0c;然后使用布尔索引来筛选这些行。以下我举个例子&#xff1a; 假设数据集存储在一个名为 data.csv 的 CSV 文件中&#x…

做到这九点,工作就无后顾之忧

大家好&#xff0c;今天又跟大家分享一篇&#xff0c;怎么在职场上做到挺起腰杆做事。全文共分9点&#xff0c;尤其最后一点最为重要。篇幅有点长&#xff0c;全文共计三千多字&#xff0c;请耐心看完。 如果您觉得对您有些帮助&#xff0c;点赞收藏关注。谢谢您的支持。 在职场…

Apache Doris主要应用场景和一些实际案例

Apache Doris 是一个现代化的分布式分析型数据库&#xff0c;具备高性能、实时性和高并发性等特点&#xff0c;被广泛应用于多种场景。以下是Doris的主要应用场景和一些实际案例。 应用场景 1. 实时数据分析 数据流处理&#xff1a;Doris可以实时 ingest&#xff08;引入&am…

嵌入式项目分享| 终极智能手表,全过程+全开源分享

这是一个非常完整的智能手表开源项目,功能齐全,且资料开源,如果你是:自己平时喜欢diy的工程师,想要提升开发技能的学生,马上要做毕设的大四学生,这个手表很值得一做,别错过了~~ 所有开源的资料以及原文链接见文末。 先来看下这个手表的功能: 首先,是一个可以佩戴的手…

windows10 无法识别双频合一的5Gwifi

windows10 无法识别双频合一的5Gwifi 在网络配置中指定 wireless mode 为802.11a 或802.11ac 这两个是 5G网络的协议&#xff0c;如果不存在则说明无线网卡不支持5G网络

使用goroutine开多个协程交替打印1234,使用channel实现

使用goroutine开多个协程交替打印1234&#xff0c;使用channel实现 package mainimport ("fmt""sync""time" )var (chNum chan intwg sync.WaitGroup )func main() {chNum make(chan int, 4)chNum <- 1for i : 1; i < 4; i {wg.Add(1…

wss客户端请求(python websocket)

import asyncio import websockets import jsonasync def connect_to_wss(uri):# 连接到WSS服务器async with websockets.connect(uri) as websocket:# 执行一些操作&#xff0c;例如发送和接收消息data {"脱敏处理"}await websocket.send(json.dumps(data))while 1…

MySQL时间转换

1. bigint类型的时间戳 1.1 将bigint转为datetime FROM_UNIXTIME(时间戳 / 1000) 1.2 将bigint转为date 方式一&#xff1a; DATE(FROM_UNIXTIME(时间戳 / 1000)) 方式二&#xff1a;字符串隐式转换 FROM_UNIXTIME(时间戳 / 1000, %Y-%m-%d) 1.3 将bigint转为指定格式的…

修改docker中mongodb容器的时区

假设容器名称为mongodb&#xff0c;设置时区为上海时区的命令为&#xff1a; docker exec -it mongodb bash -c "ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai > /etc/timezone"验证时区更改&#xff1a; docker e…

51单片机STC89C52RC——9.1 DS1302涓流充电计时芯片

目录 目的/效果 一&#xff0c;STC单片机模块 二&#xff0c;DS1302计时器 2.1 特性/板子位置 2.1.1 特性 2.1.2 板子上的位置 2.2 针脚定义 2.3 数据传输 2.3.1 读数据 2.3.2 写数据 2.4 BCD码 2.5 可编程涓流充电器 2.6 时钟动态设置 三&#xff0c;创建Keil项目…

《数据赋能:一本书讲透数字化营销与运营》—— 从正确的数据观开始

基于数据打通的“全链路”营销是当下的“时髦”&#xff0c;应用它的前提是什么&#xff1f;深度营销和运营的关键数据如何获得&#xff1f;如何利用数据进行更精准的营销投放&#xff1f;如何利用数据优化投放的效果&#xff1f;如何促进消费者的转化&#xff0c;以及激活留存…