react-router v6
React Router 6x比5x有哪些改动?
内置组件将<Switch/>
改为<Routes/>
等
语法变化component={About}
改为element={<About/>}
等
1. BrowserRouter与HashRouter
用来包裹整个应用,<HashRouter>
修改的是地址的hash值
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import { BrowserRouter } from 'react-router-dom';ReactDOM.createRoot(document.getElementById('root')).render(<BrowserRouter><App/></BrowserRouter>
)
2. Routes与Route
将Switch
替换成了Routes
- 普通路由
import { HashRouter,Route,Routes } from 'react-router-dom';// Routes替换了Switch
<HashRouter><Routes><Route path="/home" element={ <Home/> }></Route><Route path="/user" element={ <User/> }></Route></Routes>
</HashRouter>
- 嵌套路由
Route
嵌套Route
使用,并且需要使用<Outlet/>
在父组件指定子组件渲染的位置,<Outlet/>
就相当于占位符。
<Routes><Route path="/" element={<Admin />} ><Route path="home" element={<Home />} /><Route path="user" element={<User />} /></Route></Routes>
解析:
这里的父组件是<Admin/>
,子组件分别是<Home/>
、<User/>
。
这里需要注意的是需要在父组件<Admin/>
中指定子组件要渲染的某个位置。
// Admin
import React from 'react';
import {Outlet} from "react-router-dom";
const Admin = () => {return (<div><h1>这是父组件,使用Outlet指定子组件位置</h1><Outlet/></div>)
}
export default Admin;
3. Link导航组件修改URL
<Link/>
代表一个链接,在html界面中会解析成a标签。作为一个链接,必须有一个to属性,代表链接地址。这个链接地址是一个相对路径。
属性:
to: 链接地址
replace: 布尔类型,当前页面是否关闭
state: 传递信息
<div><Link to="/home">Home</Link> |{" "}<Link to="/user">User</Link>
</div>
4. NavLink 导航组件修改URL
渲染后的a标签,会自动添加active
类名,实现高亮
to属性代表链接地址
根据组件是否激活,可以将函数传递给 style 或 className 来自定义内联样式或类字符串,也可以将函数作为子项传递给自定义 <NavLink> 组件来更改内部元素样式。
import * as React from "react";
import { NavLink } from "react-router-dom";function NavList() {// 将当前所选路由的样式应用于 <NavLink>。let activeStyle = {textDecoration: "underline"};let activeClassName = "underline"return (<nav><ul><li><NavLinkto="messages"style={({ isActive }) =>isActive ? activeStyle : undefined}>Messages</NavLink></li><li><NavLinkto="tasks"className={({ isActive }) =>isActive ? activeClassName : undefined}>Tasks</NavLink></li>// 传递信息给子项<li><NavLinkto="tasks">{({ isActive }) => (<span className={isActive ? activeClassName : undefined}>Tasks</span>))}</NavLink></li></ul></nav>);
}
5. Navigate
重定向
属性:
to: 链接地址
replace: 布尔类型,当前页面是否关闭
state: 传递信息
<Routes><Route path="/ho" element={<Navigate to='/user' />} />
</Routes>
本来是跳转至/ho
,然后重定向至了/user
。
6. 404
<Routes><Routepath="*"element={<main style={{ padding: "1rem" }}><p>There's nothing here!</p></main>}/>
</Routes>
7. 路由传参
三种方式:params, search, state
- useParams读取URL参数
路由格式 /home/12
<Routes><Route path="/" element={<Admin />} ><Route path="home" element={<Home />} ><Route path=":id" element={<HomeSon />} /></Route></Route>
</Routes>
// HomeSon页面import React from 'react';
import { useParams } from 'react-router-dom';const HomeSon = () => {// id 就是传过来的参数 id就是12let { id } = useParams();return (<div>这是HomeSon页面 {id}</div>)
}
export default HomeSon;
- useSearchParam
路由格式 /home?id=1
<Routes><Route path="/" element={<Admin />} ><Route path="user" element={<User />} ></Route></Route>
</Routes><NavLink to="/user?id=1" style={({ isActive }) =>isActive ? activeStyle : undefined}>
User</NavLink>
// User页面import React from 'react';
import { useSearchParams } from 'react-router-dom';const User = () => {let [searchParams] = useSearchParams();const id = searchParams.get('id'); // id为参数值return (<div>这是user页面</div>)
}export default User;
- state传参
在地址栏看不见参数
useLocation方法获取参数
// state定义id为1
<divstyle={{borderBottom: "solid 1px",paddingBottom: "1rem"}}
><NavLink to='/state' state={{ id: 1 }}>State</NavLink>
</div>
// state页面import { useLocation } from 'react-router-dom';const State = () => {const {state} = useLocation();console.log(state); // { id: 1 }return (<div style={{ display: "flex" }}><div>这是State组件</div><div>{state}</div></div>);
}
export default State;
8. 索引路由
注意,它有’ index ‘属性而不是’ path '。这是因为索引路由共享父路由的路径。这就是重点——它没有路径。
也许你还在困惑。我们有几种方法来回答“什么是索引路由?”希望其中一条能给你答疑:
在父路由路径的出口出呈现索引路由
当父路由匹配但其他子路由都不匹配时,索引路由匹配。
索引路由是父路由的默认子路由。
当用户还没有单击导航列表中的项目之一时,索引路由会呈现。
比如:/home
渲染Home
组件,/user
渲染User
组件,而此时/
若没有定义展示那个组件,则将是空白,而索引路由则解决了这个问题,若索引路由规定A
组件,则会在Outlet
处进行渲染A
组件。
<Routes><Route path="/" element={<Admin />} ><Route path="home" element={<Home />} ><Routeindexelement={<main style={{ padding: "1rem" }}><p>Select an invoice</p></main>}/><Route path=":id" element={<HomeSon />} /></Route></Route>
</Routes>
9. 编程式路由 useNavigate
不传参
const ProgrammaticIndex = () => {const nav = useNavigate();const jump = () => {nav('/useNavigateRouter');}return (<div style={{padding: '20px'}}><button onClick={() => jump()}>跳转至useNavigateRouter, useNavigate()方法</button></div>)
}
传参
属性:replace 决定是否替换当前的路由,若替换返回时将不能回到当前的路由
const ProgrammaticIndex = () => {const nav = useNavigate();const jump = () => {nav('/useNavigateRouter', {replace: false,state:{ id:'reactiv3'}});}return (<div style={{padding: '20px'}}><button onClick={() => jump()}>跳转至useNavigateRouter, useNavigate()方法</button></div>)
}
10. useRoutes方法
useRoutes hook 在功能上等同于 <Routes> ,使用 JavaScript 对象而不是 <Route> 元素来定义路由,所用对象与普通 <Route> 元素 具有相同属性但不需要用 JSX。
就是<Routes>的另一种写法,用js写,useRoutes接受一个数组,每项就是路由
Routes
写法
import React, {useEffect} from 'react'
import {Route, Routes} from 'react-router-dom';
import Home from "../home/index.jsx";
import User from "../user/index.jsx";const Layout = () => {return (<div className='content'><Routes><Route path="/" element={<Admin />} ><Route path="home" element={<Home />} /><Route path="user" element={<User />} /></Route></Routes></div>)
}export default Layout;
useRoutes
写法
import React, {useEffect} from 'react'
import {useRoutes} from 'react-router-dom';
import Home from "../home/index.jsx";
import User from "../user/index.jsx";const Layout = () => {const routeElement = useRoutes([{path: '/',element: <Admin/>,children: [{path: 'home',element: <Home/>,},{path: 'user',element: <User/>,}]}]);return (<div id='loayout'>{routeElement}</div>)
}export default Layout;
11. 路由懒加载
使用lazy
进行包裹
import * as React from 'react';
import { Routes, Route, Outlet, Link } from 'react-router-dom';const About = React.lazy(() => import('./pages/About'));
react-router v6相关推荐
- React Router v6 的路由切换实现方式
首先需要先引入路由库,并配置好路由规则. 在React Router v6中,可以使用<Routes>和<Route>组件来定义路由规则. 例如: # 使用<Routes ...
- 在React中使用React Router v6
具有多个视图的单页应用程序 (SPA) 需要有一种路由机制,以便在这些不同视图之间导航,而无需刷新整个网页.这可以通过使用诸如React Router之类的路由库来处理. 在本教程中,让我们看看如何使 ...
- React Router V6 新特性
安装 npm install react-router-dom@6 配置路由 import { render } from "react-dom"; import {Browser ...
- React Router v6
https://juejin.cn/post/7025418839454122015#heading-7
- React Router 升级 v6: Redirect 重定向替代方案
React Router 升级 v6: Redirect 重定向替代方案 文章目录 React Router 升级 v6: Redirect 重定向替代方案 React Router v6 Redir ...
- react router
目录 前言 核心 1.内置的组件 2.内置的路由器组件 3.History 对象 4.Location 对象 5.react router 的安装包 一.React-Router v1 1.一些概念 ...
- React路由V6技术文档
React Router 6 快速上手 1.概述 React Router 以三个不同的包发布到 npm 上,它们分别为: react-router: 路由的核心库,提供了很多的:组件.钩子. rea ...
- React router 的 Route 中 component 和 render 属性理解
React router 的 Route 中 component 和 render 属性理解 Route 标签的三个互斥属性 render.component.children Route 就是用来匹 ...
- router路由react_使用React Router在React中受保护的路由
router路由react In this video, you will see how to create a protected route using React Router. This r ...
- hitchhiker部署_Hitchhiker的React Router v4指南:无限远的递归路径!
hitchhiker部署 Welcome to the third part of the Hitchhiker's Guide to React Router v4. In this article ...
最新文章
- Python Tkinter小试
- 1.10a – 如何设计你的第一个程序
- Hello程序的转换处理过程及程序执行时的数据流动过程
- Jib –为Spring Boot应用程序构建docker映像
- Mac OS 的历史
- 解决android studio引用远程仓库下载慢(JCenter下载慢)
- IMP-00041: 警告: 创建的对象带有编译警告解决办法
- 系统集成资质培训 - 2013下半年系统集成资质申报及集成资质考试
- 服务器维护 文档,ERP系统维护服务器维护管理文档.docx
- [转载] python3 opencv 图像二值化笔记(cv2.adaptiveThreshold)
- 每天学点5G-5G UDR
- UE4内容浏览器改文件夹名称后无法删除空文件夹
- ECMAScript 变量
- 【ISP】浅析Lens Shading
- 错误(mailed 59 bytes of output but got status 0x004b#012)
- 易班自动打卡+钉钉机器人消息提醒
- MySQL数据库数据传到Excel
- java程序开启远程调试、断点功能
- 从面试官的角度聊聊培训班对程序员的帮助,同时给培训班出身的程序员一些建议...
- 《逆向工程核心原理》相关说明
热门文章
- 自建Alist共享网盘网站
- LWN:利用PAM Duress来增加一个被胁迫时的专用密码!
- 2018.9.18中科38所面试
- 第一讲:高性能计算基础知识讲解
- YOLOV7使用CADCD数据集实验记录
- 【JavaSE专栏内容导航】JavaSE与数据结构基础知识系列
- OpenCV Error: Unspecified error (could not find a writer for the specified extension) in imwrite
- FPGA的基础架构,什么是CLB?
- java入门编程(一)
- 魔都上海财务自由需要多少万?