09-React路由使用(React Router 6)
9-React Router 6的使用
1.概述
-
React Router 以三个不同的包发布到 npm 上,它们分别为:
- react-router: 路由的核心库,提供了很多的:组件、钩子。
- react-router-dom: 包含react-router所有内容,并添加一些专门用于 DOM 的组件,例如
<BrowserRouter>等 。 - react-router-native: 包括react-router所有内容,并添加一些专门用于ReactNative的API,例如:
<NativeRouter>等。
-
与React Router 5.x 版本相比,改变了什么?
-
内置组件的变化:移除
<Switch/>,新增<Routes/>等。 -
语法的变化:
component={About}变为element={<About/>}等。 -
新增多个hook:
useParams、useNavigate、useMatch等。 -
官方明确推荐函数式组件了!!!
…
-
2.常用路由API
1).一级路由导航
a.路由导航基本实现
在React Router 5版本中,使用
<BrowserRouter>或<HashRouter>、<Route/>、<Link>来实现基本的路由导航实现,使用<Switch>提升路由的查找效率。在React Router 6版本中<BrowserRouter>、<HashRouter>、<Route/>、<Link>等标签进行了保留,移除了<Switch>,让新标签```代替
// 一级路由的基本实现
import { NavLink, Route, Routes,Navigate } from 'react-router-dom'
export default function App() {return (<div><div className="row"><div className="col-xs-offset-2 col-xs-8"><Header /></div></div><div className="row"><div className="col-xs-2 col-xs-offset-2"><div className="list-group"><Link className="list-group-item" to="/about">About</Link><Link className="list-group-item" to="/home">Home</Link></div></div><div className="col-xs-6"><div className="panel"><div className="panel-body"><Routes><Route path="/about" element={<About/>} /><Route path="/home" element={<Home/>} /></Routes></div></div></div></div></div>)
}
<BrowserRouter>
-
说明:
<BrowserRouter>用于包裹整个应用。 -
示例代码:
import React from "react"; import {createRoot} from 'react-dom/client'; import {BrowserRouter} from 'react-router-dom' import App from "./App"; createRoot(document.getElementById('root')).render(<BrowserRouter>{/* 整体结构(通常为App组件) */}<App/></BrowserRouter> )
<HashRouter>
- 说明:作用与
<BrowserRouter>一样,但<HashRouter>修改的是地址栏的hash值。 - 备注:6.x版本中
<HashRouter>、<BrowserRouter>的用法与 5.x 相同。
<Routes/> 与 <Route/>
-
v6版本中移出了先前的
<Switch>,引入了新的替代者:<Routes>。 -
<Routes>和<Route>要配合使用,且必须要用<Routes>包裹<Route>。 -
<Route>相当于一个 if 语句,如果其路径与当前 URL 匹配,则呈现其对应的组件。 -
<Route caseSensitive>属性用于指定:匹配时是否区分大小写(默认为 false)。 -
当URL发生变化时,
<Routes>都会查看其所有子<Route>元素以找到最佳匹配并呈现组件 。 -
<Route>也可以嵌套使用,且可配合useRoutes()配置 “路由表” ,但需要通过<Outlet>组件来渲染其子路由。 -
示例代码:
<Routes>/*path属性用于定义路径,element属性用于定义当前路径所对应的组件*/<Route path="/login" element={<Login />}></Route>/*用于定义嵌套路由,home是一级路由,对应的路径/home*/<Route path="home" element={<Home />}>/*test1 和 test2 是二级路由,对应的路径是/home/test1 或 /home/test2*/<Route path="test1" element={<Test/>}></Route><Route path="test2" element={<Test2/>}></Route></Route>//Route也可以不写element属性, 这时就是用于展示嵌套的路由 .所对应的路径是/users/xxx<Route path="users"><Route path="xxx" element={<Demo />} /></Route> </Routes>
<Link>
- 作用: 修改URL,且不发送网络请求(路由链接)。
- 注意: 外侧需要用
<BrowserRouter>或<HashRouter>包裹。
b.路由导航的重定向
在React Router 5版本中,使用
<Redirect>进行重定向,在在React Router 6版本中使用<Navigate>实现重定向
export default function App() {return (<div><div className="row"><div className="col-xs-offset-2 col-xs-8"><Header /></div></div><div className="row"><div className="col-xs-2 col-xs-offset-2"><div className="list-group"><NavLink className="list-group-item" to="/about">About</NavLink><NavLink className="list-group-item" to="/home">Home</NavLink></div></div><div className="col-xs-6"><div className="panel"><div className="panel-body"><Routes><Route path="/about" element={<About/>} /><Route path="/home" element={<Home/>} /><Route path="/" element={<Navigate to="/about"/>}/></Routes></div></div></div></div></div>)
}
<Navigate>
-
作用:只要
<Navigate>组件被渲染,就会修改路径,切换视图。 -
replace属性用于控制跳转模式(push 或 replace,默认是push)。 -
示例代码:
import React,{useState} from 'react' import {Navigate} from 'react-router-dom'export default function Home() {const [sum,setSum] = useState(1)return (<div><h3>我是Home的内容</h3>{/* 根据sum的值决定是否切换视图 */}{sum === 1 ? <h4>sum的值为{sum}</h4> : <Navigate to="/about" replace={true}/>}<button onClick={()=>setSum(2)}>点我将sum变为2</button></div>) }
c.路由的高亮效果
在React Router 5版本中,使用
<NavLink>进行路由导航高亮,在React Router 6版本中还有一种通过判断条件的方法
//写法一
<NavLink className={({isActive}) => isActive?"list-group-item atguigu":"list-group-item"} to="/about">About</NavLink>
<NavLink className={({isActive}) => isActive?"list-group-item atguigu":"list-group-item"} to="/home">Home</NavLink>
//写法二
function computedClassName({isActive}) {return isActive?"list-group-item atguigu":"list-group-item"
}
<NavLink className={computedClassName} to="/about">About</NavLink>
<NavLink className={computedClassName} to="/home">Home</NavLink>
分析:
-
写在
className中的箭头函数会接收到一个对象<NavLink className={(a) => {console.log(a);}} to="/about">About</NavLink> <NavLink className="list-group-item" to="/home">Home</NavLink>
-
这个对象中有一个
isActive属性,它会存储该组件是否处于显示状态,是就返回true
-
可以将这个属性解构出来,通过读取判断这个属性的布尔值动态为元素添加高亮的样式
<NavLink className={({isActive}) => isActive?"list-group-item atguigu":"list-group-item"} to="/about">About</NavLink> <NavLink className={({isActive}) => isActive?"list-group-item atguigu":"list-group-item"} to="/home">Home</NavLink>
<NavLink>
-
作用: 与
<Link>组件类似,且可实现导航的“高亮”效果。 -
示例代码:
// 注意: NavLink默认类名是active,下面是指定自定义的class//自定义样式 <NavLinkto="login"className={({ isActive }) => {console.log('home', isActive)return isActive ? 'base one' : 'base'}}>login</NavLink>/*默认情况下,当Home的子组件匹配成功,Home的导航也会高亮,当NavLink上添加了end属性后,若Home的子组件匹配成功,则Home的导航没有高亮效果。 */ <NavLink to="home" end >home</NavLink>
d.路由表
<Route>也可以嵌套使用,且可配合useRoutes()配置 “路由表” ,但需要通过<Outlet>组件来渲染其子路由。
export default function App() {// 根据路由表生成对应的路由规则const element=useRoutes([{path: '/about',element: <About />},{path: '/home',element: <Home />},{path: '/',element: <Navigate to="/about" />},])return (<div><div className="row"><div className="col-xs-offset-2 col-xs-8"><Header /></div></div><div className="row"><div className="col-xs-2 col-xs-offset-2"><div className="list-group"><NavLink className="list-group-item" to="/about">About</NavLink><NavLink className="list-group-item" to="/home">Home</NavLink></div></div><div className="col-xs-6"><div className="panel"><div className="panel-body">{element}</div></div></div></div></div>)
}
useRoutes()
-
作用:根据路由表,动态创建
<Routes>和<Route>。 -
示例:
-
一般会将路由表写到另一个文件中进行管理,便于多个组件引入使用
//路由表配置:src/routes/index.js import About from '../pages/About' import Home from '../pages/Home' import {Navigate} from 'react-router-dom' export default [{path:'/about',element:<About/>},{path:'/home',element:<Home/>},{path:'/',element:<Navigate to="/about"/>} ] -
进路由表的规则引入到组件中使用
//App.jsx import React from 'react' import {NavLink,useRoutes} from 'react-router-dom' import routes from './routes' export default function App() {//根据路由表生成对应的路由规则const element = useRoutes(routes)return (<div>......{/* 注册路由 */}{element}......</div>) }
-
2).多级路由导航
a.多级路由基本实现
-
在路由表中编写多级路由规则
//路由表配置:src/routes/index.js export default [{path: '/about',element: <About />},{path: '/home',element: <Home />,children: [{path: 'news',element: <News />},{path: 'message',element: <Message />,children: [{path: 'detail',element: <Detail />}]}]},{path: '/',element: <Navigate to="/about" />}, ] -
使用
<Outlet>渲染一级路由的后续子路由<Outlet>当
<Route>产生嵌套时,渲染其对应的后续子路由。export default function Home() {return (<div><h2>我是Home组件</h2><div><ul class="nav nav-tabs"><li><NavLink className="list-group-item" to="news">News</NavLink></li><li><NavLink className="list-group-item" to="message">Message</NavLink></li></ul></div>{/* 指定路由组件呈现的位置 */}<Outlet/></div>) }
b.多级路由传递参数
①.传递params参数
-
在路由表中的路由规则中编写参数名进行占位
//路由表配置:src/routes/index.js {path: 'message',element: <Message />,children: [{path: 'detail/:id/:title/:content',element: <Detail />}] } -
在组件的路由链接的匹配路径中编写传入的参数
export default function Message() {const [messages] = useState([{ id: '1', title: '消息1', content: '锄禾日当午' },{ id: '2', title: '消息2', content: '汗滴禾下土' },{ id: '3', title: '消息3', content: '谁时盘中餐' },{ id: '4', title: '消息4', content: '粒粒皆辛苦' },])return (<div><ul>{messages.map(message => {return (<li key={message.id}>{/* <Link to="detail">{message.title}</Link> */}<Link to={`detail/${message.id}/${message.title}/${message.content}`}>{message.title}</Link> </li>)})}</ul><Outlet /></div>) } -
在路由组件中使用
useParams这个HOOKS读取parpms参数useParams作用:回当前匹配路由的
params参数,类似于5.x中的match.params。import {useParams,useMatch} from 'react-router-dom' export default function Detail() {const {id,title,content}=useParams()return (<ul><li>消息编号:{id}</li><li>消息标题:{title}</li><li>消息内容:{content}</li></ul>) }分析:
useParams这个函数会将路由路径中的params参数包装成一个对象返回const a=useParams(); console.log(a);

useMatch()
-
作用:返回当前匹配信息,对标5.x中的路由组件的
match属性。 -
示例代码:
<Route path="/login/:page/:pageSize" element={<Login />}/> <NavLink to="/login/1/10">登录</NavLink>export default function Login() {const match = useMatch('/login/:x/:y')console.log(match) //输出match对象//match对象内容如下:/*{params: {x: '1', y: '10'}pathname: "/LoGin/1/10" pathnameBase: "/LoGin/1/10"pattern: {path: '/login/:x/:y', caseSensitive: false, end: false}}*/return (<div><h1>Login</h1></div>) }
-
②.传递search参数
-
传递search参数不需要在·路由表文件中匹配参数占位符
-
父组件将参数编写到路由路径中
<Link to={`detail?id=${message.id}&title=${message.title}&content=${message.content}`}>{message.title}</Link> -
子组件使用
useSearchParams函数读取传入的search参数useSearchParams- 作用:用于读取和修改当前位置的 URL 中的查询字符串。
- 返回一个包含两个值的数组,内容分别为:当前的seaech参数、更新search的函数。
import {useSearchParams} from 'react-router-dom' export default function Detail() {const [search,setSearch]=useSearchParams()const id=search.get('id')const title=search.get('title')const content=search.get('content')return (<div><ul><li>消息编号:{id}</li><li>消息标题:{title}</li><li>消息内容:{content}</li></ul></div>) } -
分析:
-
需要创建一个数组来接受
useSearchParams函数的返回值;数组中第一个元素为search,不能直接使用search中的数值,需要用其中自带的get方法获取指定key的数值;另一个为修改search的方法名const [search,setSearch]=useSearchParams()const id=search.get('id')const title=search.get('title')const content=search.get('content') -
setSearch方法可以直接修改search中的数值<button onClick={()=>setSearch('id=008&title=消息008')}>更新Search</button>
-
③.传递state参数
-
传递search参数不需要在·路由表文件中匹配参数占位符
-
父组件将参数编写到路由路径中
<Link to="detail" state={{id:message.id,title:message.title,content:message.content}}>{message.title}</Link> -
子组件使用
useSearchParams函数读取传入的state参数import {useLocation} from 'react-router-dom' export default function Detail() {// 多重解构const {state:{id,title,content}}=useLocation()return (<ul><li>消息编号:{id}</li><li>消息标题:{title}</li><li>消息内容:{content}</li></ul>) }分析:
-
useSearchParams函数会返回一个对象,这个对象中就包含了存储了state参数的属性const a=useLocation() console.log(a);
-
3).编程式路由导航
useNavigate()
-
作用:返回一个函数用来实现编程式导航。
-
使用:
-
第一种使用方式:指定具体的路径
export default function Message() {const navigate = useNavigate()function showDetail(message) {navigate('/about')}return (<div><ul>{messages.map(message => {return (<li key={message.id}><Link to="detail">{message.title}</Link><button onClick={()=>showDetail(message)}>查看详情</button></li>)})}</ul><Outlet /></div>) }
如果需要传递数值,
params参数和search参数直接写在路径中,state参数则配置成一个对象export default function Message() {const navigate = useNavigate()const [messages] = useState([{ id: '1', title: '消息1', content: '锄禾日当午' },{ id: '2', title: '消息2', content: '汗滴禾下土' },{ id: '3', title: '消息3', content: '谁时盘中餐' },{ id: '4', title: '消息4', content: '粒粒皆辛苦' },])function showDetail(message) {navigate('detail',{replace:false,state:{id:message.id,title:message.title,content:message.content}})}return (<div><ul>{messages.map(message => {return (<li key={message.id}><Link to="detail">{message.title}</Link> <button onClick={()=>showDetail(message)}>查看详情</button></li>)})}</ul><Outlet /></div>) }
-
第二种使用方式:传入数值进行前进或后退,类似于5.x中的 history.go()方法
import { useNavigate} from 'react-router-dom' export default function Header() {const navigate = useNavigate()function go() {navigate(1)}function back() {navigate(-1)}return (<div className="col-xs-offset-2 col-xs-8"><div className="page-header"><h2>React Router Demo</h2><button onClick={go}>前进→</button><button onClick={back}>←后退</button></div></div>) }
-
3.非常用路由API
1).useInRouterContext()
作用:如果组件在 <Router> 的上下文中呈现,则 useInRouterContext 钩子返回 true,否则返回 false。
import { useNavigate,useInRouterContext} from 'react-router-dom'
export default function Header() {const navigate = useNavigate()console.log('Header',useInRouterContext());return (<div className="col-xs-offset-2 col-xs-8"><div className="page-header"><h2>React Router Demo</h2></div></div>)
}
2). useNavigationType()
-
作用:返回当前的导航类型(用户是如何来到当前页面的)。
-
返回值:
POP、PUSH、REPLACE。//PUSH方式 <NavLink className="list-group-item" to="news">News</NavLink>//REPLACE方式 <NavLink className="list-group-item" replace to="news">News</NavLink> -
备注:
POP是指在浏览器中直接打开了这个路由组件(刷新页面)。
3). useOutlet()
-
作用:用来呈现当前组件中渲染的嵌套路由。
-
示例代码:
const result = useOutlet() console.log(result) // 如果嵌套路由没有挂载,则result为null // 如果嵌套路由已经挂载,则展示嵌套的路由对象
4).useResolvedPath()
-
作用:给定一个 URL值,解析其中的:path、search、hash值。
console.log(useResolvedPath('/user?id=001&name=tom#qwe'));
相关文章:
09-React路由使用(React Router 6)
9-React Router 6的使用 1.概述 React Router 以三个不同的包发布到 npm 上,它们分别为: react-router: 路由的核心库,提供了很多的:组件、钩子。react-router-dom: 包含react-router所有内容,并添加一些专门用于 DOM …...
Linux上常用网络相关命令
1. ifconfig: - 显示所有网络接口的配置信息:ifconfig - 显示特定网络接口(例如eth0)的配置信息:ifconfig eth0 2. ip: - 显示网络接口的配置信息:ip addr show - 显示路由表&…...
contenteditable实现文本内容确认提示
功能需求: 列表进行批量查询,需要对输入的值做提交校验,分三种情况: 若部分字符串有误,部分字符串需要变更字体颜色做提示,再次点击确认则对部分正确数据执行批量查询 若全部数据有误则变更字体颜色做提示&…...
vue2vue3--render函数(h)
目录 h函数 方法1. 在Options API中的使用 方法2. 在Composition API中的使用 Vue 2中的渲染函数 基础 vue2 vue3 vue3--声明渲染函数 节点、树以及虚拟 DOM 虚拟 DOM createElement 参数 深入数据对象 约束 vue2 vue3 使用 JavaScript 代替模板功能…...
网络协议--动态选路协议
10.1 引言 在前面各章中,我们讨论了静态选路。在配置接口时,以默认方式生成路由表项(对于直接连接的接口),并通过route命令增加表项(通常从系统自引导程序文件),或是通过ICMP重定向…...
30天精通Nodejs--第一天:入门指南
介绍 看一下下面这段比较官方的介绍: Node.js是一个基于Chrome V8引擎的JavaScript运行时环境,可以用于构建可扩展的网络应用程序。它的特点在于能够使JavaScript在服务器端运行,能够利用JavaScript的强大功能来处理服务器端的事务。 Nodejs的特点 高效的异步编程:Node.…...
C# ref用法,实现引用传递(地址传递)
前言: 今天这篇文章我们简单学习一下C# ref的用法,在看别人的代码不至于看不懂逻辑,虽然这是一个比较简单的知识点,但是还是值得我们去学习一下关于这个知识点一些概念,我们知道在C# 中我们的函数参数,一般…...
微信小程序数据交互------WXS的使用
🎬 艳艳耶✌️:个人主页 🔥 个人专栏 :《Spring与Mybatis集成整合》《Vue.js使用》 ⛺️ 越努力 ,越幸运。 1.数据库连接 数据表结构: 数据测式: 2.后台配置 pom.xml <?xml version&quo…...
【数据结构】String类对象的创建与字符串常量池的“神秘交易”
作者主页:paper jie_博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《JAVA数据结构》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力…...
搞个微信小程序002:个人信息
新建一个用于,和001中一样,然后,就改掉两个文件: index.wxml: <view><!-- 头像区域 --><view class"top"><view class"user-img"><image src"/images/tx.png"><…...
.obj模型文件(带材质和纹理)合并的基本思路
1、将v开头的顶点信息依次拷贝到合并新.obj中 2、将vt纹理坐标依次拷贝到合并新.obj中 3、f(面)的合并 步骤: (1)第一个obj文件的f(面)原封不动拷进新.obj中 (2)第二个…...
es : java 查询
1. POM 配置 <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.6.2</version></dependency> 2. 建立ES集群连接 RestHighLevelClient cli…...
MySQL MVCC机制探秘:数据一致性与并发处理的完美结合,助你成为数据库高手
一、前言 在分析 MVCC 的原理之前,我们先回顾一下 MySQL 的一些内容以及关于 MVCC 的一些简单介绍。(注:下面没有特别说明默认 MySQL 的引擎为 InnoDB ) 1.1 数据库的并发场景 数据库并发场景有三种,分别是: 读-读…...
5分钟搞懂分布式可观测性
可观测性是大规模分布式(微服务)系统的必要组件,没有可观测系统的支持,监控和调试分布式系统将是一场灾难。本文讨论了可观测系统的主要功能,并基于流行的开源工具搭建了一套可观测系统架构。原文: A Primer on Distributed Systems Observab…...
桥梁结构健康监测系统落地方案
桥梁结构健康监测的意义是多方面的。首先,它可以实时采集桥梁的结构数据,并对其进行处理和分析,以确定结构损伤的位置、评估桥梁的健康状况,并预测承载力的发展趋势。这有助于及时发现桥梁的结构问题和潜在风险,为采取…...
hive和presto的求数组长度函数区别及注意事项
1、任务 获取邮箱字符串’后字符串 ,求长度 2、hive & spark-sql 求数组长度的函数 size hive & spark-sql 求数组长度的函数 sizeselect size(split(email, )),split(email, ),split(email, )[0],split(email, )[1] FROM (select "jack126.com"…...
Kotlin Lambda表达式与标准库中的高阶函数
在Kotlin中,Lambda表达式和标准库中的高阶函数为我们提供了一种简洁而强大的方式来处理集合和执行各种操作。本篇博客将介绍Lambda表达式的基本概念,并结合标准库中的高阶函数示例,展示它们的用法和功能。 Lambda表达式的基本概念 Lambda表…...
【JavaEE初阶】 CAS详解
文章目录 🌲什么是 CAS🚩CAS伪代码 🎋CAS 是怎么实现的🌳CAS的应用🚩实现原子类🚩实现自旋锁 🎄CAS 的 ABA 问题🚩什么是 ABA 问题🚩ABA 问题引来的 BUG🚩解决…...
Docker镜像制作
目录 Dockfile是什么 构建镜像的三个步骤 dockerfile内容基础知识 docker执行一个Dockerfile脚本的大致流程 Dockerfile指令 FROM MAINTAINER RUN EXPOSE WORKDIR ENV ADD COPY VOLUME USER ONBUILD CMD ENTRYPOINT CMD和ENTRYPOINT区别 构建dockerfile Do…...
v-on 可以监听多个方法吗?
目录 编辑 前言:Vue 3 中的 v-on 指令 详解:v-on 指令的基本概念 用法:v-on 指令监听多个方法 解析:v-on 指令的优势和局限性 优势 局限性 **v-on 指令的最佳实践** - **适度监听**: - **方法抽离**&#x…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
Spring Security 认证流程——补充
一、认证流程概述 Spring Security 的认证流程基于 过滤器链(Filter Chain),核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤: 用户提交登录请求拦…...
