当前位置:网站首页>Router 6/ 以及和Router5 的区别
Router 6/ 以及和Router5 的区别
2022-07-01 06:29:00 【song854601134】
文章目录
React Router 6 快速上手
1.概述
React Router 以三个不同的包发布到 npm 上,它们分别为:
react-router: 路由的核心库,提供了很多的:组件、钩子。
react-router-dom: 包含react-router所有内容,并添加一些专门用于 DOM 的组件,例如 等 。
react-router-native: 包括react-router所有内容,并添加一些专门用于ReactNative的API,例如:等。
与React Router 5.x 版本相比,改变了什么?
内置组件的变化:移除
语法的变化:component={About} 变为 element={}等。
新增多个hook:useParams、useNavigate、useMatch等。
官方明确推荐函数式组件了!!!
…
2.Component
1. <BrowserRouter>
- 说明:
<BrowserRouter>用于包裹整个应用。 - 示例代码:
import React from "react";
import ReactDOM from "react-dom";
import { BrowserRouter } from "react-router-dom";
ReactDOM.render(
<BrowserRouter>
{/* 整体结构(通常为App组件) */}
</BrowserRouter>,root
);
- 说明:作用与一样,但修改的是地址栏的hash值。 备注:6.x版本中、 的用法与 5.x 相同。
- 与
v6版本中移出了先前的,引入了新的替代者:。
和 要配合使用,且必须要用包裹。
相当于一个 if 语句,如果其路径与当前 URL 匹配,则呈现其对应的组件。
属性用于指定:匹配时是否区分大小写(默认为 false)。
当URL发生变化时,都会查看其所有子 元素以找到最佳匹配并呈现组件 。
也可以嵌套使用,且可配合useRoutes()配置 “路由表” ,但需要通过 组件来渲染其子路由。
示例代码:
<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>
4. <Link>
- 作用: 修改URL,且不发送网络请求(路由链接)。
- 注意: 外侧需要用
<BrowserRouter>或<HashRouter>包裹。 - 示例代码:
import { Link } from "react-router-dom";
function Test() {
return (
<div>
<Link to="/路径">按钮</Link>
</div>
);
}
5. <NavLink>
- 作用: 与
<Link>组件类似,且可实现导航的“高亮”效果。 - 示例代码:
// 注意: NavLink默认类名是active,下面是指定自定义的class
//自定义样式
<NavLink
to="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>
6. <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>
)
}
7. <Outlet>
- 当
<Route>产生嵌套时,渲染其对应的后续子路由。 - 示例代码:
//根据路由表生成对应的路由规则
const element = useRoutes([
{
path:'/about',
element:<About/>
},
{
path:'/home',
element:<Home/>,
children:[
{
path:'news',
element:<News/>
},
{
path:'message',
element:<Message/>,
}
]
}
])
//Home.js
import React from 'react'
import {NavLink,Outlet} from 'react-router-dom'
export default function Home() {
return (
<div>
<h2>Home组件内容</h2>
<div>
<ul className="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>
{/* 指定路由组件呈现的位置 */}
<Outlet />
</div>
</div>
)
}
3.Hooks
1. 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. useNavigate()
- 作用:返回一个函数用来实现编程式导航。
- 示例代码:
import React from 'react'
import {useNavigate} from 'react-router-dom'
export default function Demo() {
const navigate = useNavigate()
const handle = () => {
//第一种使用方式:指定具体的路径
navigate('/login', {
replace: false,
state: {a:1, b:2}
})
//第二种使用方式:传入数值进行前进或后退,类似于5.x中的 history.go()方法
navigate(-1)
}
return (
<div>
<button onClick={
handle}>按钮</button>
</div>
)
}
3. useParams()
- 作用:回当前匹配路由的
params参数,类似于5.x中的match.params。 - 示例代码:
import React from 'react';
import { Routes, Route, useParams } from 'react-router-dom';
import User from './pages/User.jsx'
function ProfilePage() {
// 获取URL中携带过来的params参数
let { id } = useParams();
}
function App() {
return (
<Routes>
<Route path="users/:id" element={<User />}/>
</Routes>
);
}
4. useSearchParams()
- 作用:用于读取和修改当前位置的 URL 中的查询字符串。
- 返回一个包含两个值的数组,内容分别为:当前的seaech参数、更新search的函数。
- 示例代码:
import React from 'react'
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 (
<ul>
<li>
<button onClick={()=>setSearch('id=008&title=哈哈&content=嘻嘻')}>点我更新一下收到的search参数</button>
</li>
<li>消息编号:{id}</li>
<li>消息标题:{title}</li>
<li>消息内容:{content}</li>
</ul>
)
}
5. useLocation()
- 作用:获取当前 location 信息,对标5.x中的路由组件的
location属性。 - 示例代码:
import React from 'react'
import {useLocation} from 'react-router-dom'
export default function Detail() {
const x = useLocation()
console.log('@',x)
// x就是location对象:
/*
{
hash: "",
key: "ah9nv6sz",
pathname: "/login",
search: "?name=zs&age=18",
state: {a: 1, b: 2}
}
*/
return (
<ul>
<li>消息编号:{id}</li>
<li>消息标题:{title}</li>
<li>消息内容:{content}</li>
</ul>
)
}
6. 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>
)
}
useInRouterContext()
作用:如果组件在 的上下文中呈现,则 useInRouterContext 钩子返回 true,否则返回 false。useNavigationType()
作用:返回当前的导航类型(用户是如何来到当前页面的)。
返回值:POP、PUSH、REPLACE。
备注:POP是指在浏览器中直接打开了这个路由组件(刷新页面)。useOutlet()
作用:用来呈现当前组件中渲染的嵌套路由。
示例代码:
const result = useOutlet()
console.log(result)
// 如果嵌套路由没有挂载,则result为null
// 如果嵌套路由已经挂载,则展示嵌套的路由对象
10.useResolvedPath()
- 作用:给定一个 URL值,解析其中的:path、search、hash值。
6和5的区别
嵌套路由的区别
5中路由使用Switch ,6中用Route取而代之了。
5中父组件声明子路由:
<Switch>
<Route path="/about/one" element={<One />}></Route>
<Route path="/about/two" element={<Two />}></Route>
<Route path="/about/three" element={<Three />}></Route>
<Switch />*/}
6中父组件声明子路由
<Routes>
<Route path="one" element={<One />}></Route>
<Route path="two" element={<Two />}></Route>
<Route path="three" element={<Three />}></Route>
</Routes>
注意这里,如果嵌套路由写在父路由里,那么注意区分与react5的区别。在react-router5中。父路由的匹配
/about不可以省略,且在App.js中父组件所在的 Route的path中不用写*
下面这段话是在6中在父组件中声明了子组件的话,App.js中父组件所在的 Route的path中不写*会出现的警告:
router.ts:11 You rendered descendant <Routes> (or called `useRoutes()`) at "/about" (under <Route path="/about">)
but the parent route path has no trailing "*". This means if you navigate deeper, the parent won't match anymore and therefore the child routes will never render.
Please change the parent <Route path="/about"> to <Route path="/about/*">
边栏推荐
- [enterprise data security] upgrade backup strategy to ensure enterprise data security
- 10 golang operator
- Promise
- C language course set up salary management system (big homework)
- To sort out the anomaly detection methods, just read this article!
- Teach you how to implement a deep learning framework
- 伪装请求头库: anti-useragent
- Pol8901 LVDS to Mipi DSI supports rotating image processing chip
- C语言课设销售管理系统设计(大作业)
- [ManageEngine Zhuohao] helps Huangshi Aikang hospital realize intelligent batch network equipment configuration management
猜你喜欢
![阿里OSS Postman Invalid according to Policy: Policy Condition failed: [“starts-with“, “$key“, “test/“]](/img/3c/7684b7c594f7871471f89007294703.png)
阿里OSS Postman Invalid according to Policy: Policy Condition failed: [“starts-with“, “$key“, “test/“]

问题:OfficeException: failed to start and connect(二)
![[wechat applet low code development] second, resolve the code composition of the applet in practice](/img/ab/28ab01db84b1437220e659118b2871.png)
[wechat applet low code development] second, resolve the code composition of the applet in practice

【微信小程序】一文解决button、input、image组件
![[unity shader custom material panel part II]](/img/d1/8632ae680299a27b7431b2d6e03fd3.png)
[unity shader custom material panel part II]

脏读、幻读和不可重复读

To sort out the anomaly detection methods, just read this article!
![[postgraduate entrance examination advanced mathematics Wu Zhongxiang +880 version for personal use] advanced mathematics Chapter II Basic Stage mind map](/img/c0/299a406efea51f24b1701b66adc1e3.png)
[postgraduate entrance examination advanced mathematics Wu Zhongxiang +880 version for personal use] advanced mathematics Chapter II Basic Stage mind map

C语言课设学生信息管理系统(大作业)

Mongodb: I. what is mongodb? Advantages and disadvantages of mongodb
随机推荐
3. Disabling copy construction
概率论学习笔记
C language course set up student elective course system (big homework)
[wechat applet low code development] second, resolve the code composition of the applet in practice
libpng12.so. 0: cannot open shared object file: no such file or directory
On whether variables are thread safe
Find the original array for the inverse logarithm
mysql约束学习笔记
If I am in Guangzhou, where can I open an account? Is it safe to open an account online?
sql中TCL语句(事务控制语句)
How does the port scanning tool help enterprises?
How did ManageEngine Zhuohao achieve the goal of being selected into Gartner Magic Quadrant for four consecutive years?
基金定投是高风险产品吗?
Student attendance system for C language course (big homework)
What are the functions of LAN monitoring software
[unity shader amplify shader editor (ASE) Chapter 9]
TCL statements in SQL (transaction control statements)
SQL中DML语句(数据操作语言)
关于变量是否线程安全的问题
SQL语句