ReactRouter——路由配置、路由跳转、带参跳转、新route配置项

目录

写在前面

(一)初步使用router

1.安装react-router-dom

2.创建router结构 

3.嵌套路由

4.配置not found页面

(1)确切路由报错页面

(2)未配置路由报错页面

5.重定向

(二)路由跳转

1.组件跳转

3.js跳转 

(三)传递参数

1.searchParams(query)参数

2.params参数

(四)新增route配置项

1.loader

2.action

3.lazy

(六)总结


写在前面

目前准备先学习react-router 6的版本,后续旧版本的可能会另外记录

(一)初步使用router

Home v6.23.1 | React Router

1.安装react-router-dom

npm i react-router-dom

2.创建router结构 

直接来看代码!  

路由可以选择多种类型:

createBrowserRouter:history路由(推荐)

createHashRouter:哈希路由(不推荐)

createMemoryRouter:有自己的一套路由记忆栈,用于生产开发工具、无浏览器环境使用

createStaticRouter:用于服务器

Picking a Router v6.23.1 | React Router

// src/router/index.jsx
import { createBrowserRouter } from "react-router-dom";
import Home from "../views/Home";
import Login from "../views/Login";const router = createBrowserRouter([{path:'/',element: <Home />,},{path:'/login',element: <Login />,}
])export default router

这个文件后缀必须是jsx,js解析不了组件 

首先能看到开始使用方法来搭建router,而不是使用<BrowserRouter />这种组件式创建路由

createBrowserRouter这种称之为 data API,是6.4版本的新型api,虽然目前react native不支持,但很快就会支持这种写法。 

静态组件:

创建components文件夹存放静态组件,基本操作了 

路由组件:

创建views文件夹存放路由组件 

// src/views/Home.jsx
export default function Home(){return (<><div className="main"><h1>这里是home页</h1></div></>)
}

将router挂载到app.jsx(直接挂载到main.jsx也ok的)

使用RouterProvider组件将路由组件放到header和footer组件之间,再将刚刚配置的router传入router项

有点意思嗷,这不就是vue的router-view??不过目前还不确定具体有什么相似之处

import { RouterProvider } from "react-router-dom"
import router from "./router"
import Header from "./components/Header"
import Footer from "./components/Footer"
import './app.css'function App() {return (<><div className="app"><Header></Header><RouterProvider router={router} /><Footer></Footer></div></>)
}export default App

3.嵌套路由

在有路由子组件的路由父组件上放一个<Outlet />组件占位

// home.jsx
import { Outlet } from "react-router-dom"
<div className="main"><h1>这里是home页</h1><div className="layout"></div><div className="content"><Outlet /></div>
</div>

再在router结构中配置子路由:

// router/index.jsx{path:'/home',element: <Home />,errorElement:<ErrorPage />,children: [{path: "content",element: <Content />,},],},

 欧了,能显示子路由了!这个Outlet的功能跟vue的router-view肯定就是一模一样了

4.配置not found页面

先编写一个通用的errorPage页面

useRouteError hook会获取到该路由报错信息 

import { useRouteError } from "react-router-dom"export default function ErrorPage(){const routerError = useRouteError()return (<><div className="main"><h1>this page is not found!</h1><p>{routerError}</p></div></>)
}

(1)确切路由报错页面

errorElement v6.23.1 | React Router

当loader、actions配置项或者组件渲染抛出错误时,会展示errorPage页面 

const router = createBrowserRouter([{path:'/',element: <Home />,errorElement:<ErrorPage />},{path:'/login',element: <Login />,errorElement: <ErrorPage />},
])

还没学到loader、action,要晚点才能展示这个的作用了 

(2)未配置路由报错页面

和router以前版本一样 路径写成通配符 

const router = createBrowserRouter([{path:'/',element: <Home />,errorElement:<ErrorPage />},{path:'/login',element: <Login />,errorElement: <ErrorPage />},{path:'*', // 通配符 代表除上面提到的路径,其他都会直接显示errorPage页面element:<ErrorPage />}
])

5.重定向

Navigate v6.23.1 | React Router

使用Navigate组件实现路由重定向

to:前往路由  replace:是否替换历史堆栈中的当前条目

<Navigate to="/xxx" replace={true} /> 

既可以在组件处重定向,也可以在router结构里重定向

const router = createBrowserRouter([{path:'/',element: <Navigate to="/home" replace />,errorElement:<ErrorPage />,},{path:'/home',element: <Home />,errorElement:<ErrorPage />,children: [{path: "content",element: <Content />,},],},

这样网页打开时/路径就直接跳转到/home路由了

(二)路由跳转

1.组件跳转

Link v6.23.1 | React Router

用法和vue的router-link差不多,哎哟这小味上来了

要注意的是:to的路径写成content是跳转到/home/content,写成/content会直接跳转到/content路径! 

// home.jsx
<div className="main home"><div className="layout"><h3>这里是home页</h3><Link to="content">content</Link><Link to="content2">content2</Link></div><div className="content"><Outlet /></div>
</div>

 

NavLink v6.23.1 | React Router

使用navlink跳转和link的操作都一致,唯一不同的是,使用navlink跳转到目标路由后,该a标签会新增一个active类

因此,可以用于列表栏展示活跃标签的功能,将active的a标签颜色改为红色

<NavLink to="content">content</NavLink>
<NavLink to="content2">content2</NavLink>.active{color: red;
}

当需要active的样式太多, 可以改变a标签活跃的类名

<NavLink to="content" className={({ isActive }) => (isActive ? 'nav-active' : '')
}>content</NavLink>
<NavLink to="content2" className={({ isActive }) => (isActive ? 'nav-active' : '')
}>content2</NavLink>.nav-active{color: red;
}

或者是直接修改样式

<NavLink to="content" style={({ isActive }) => ({ color: isActive ? 'red' : '' })
}>content</NavLink>
<NavLink to="content2" style={({ isActive }) => ({ color: isActive ? 'red' : '' })
}>content2</NavLink>

style和className属性都需要传递一个回调函数,取得的形参就是react提供的数据,更多数据直接看文档吧,毕竟这个组件不常用

3.js跳转 

useNavigate v6.23.1 | React Router

使用useNavigate hook跳转, 第一个参数:路径,第二个参数:路由选项,剩余选项直接看文档

import { useNavigate } from "react-router-dom"
export default function Home() {const navigate = useNavigate()const goLogin = () => {// 代码跳转路由navigate('/login', { replace: false })}return (<><div className="main home"><div className="layout"><h3>这里是home页</h3><button onClick={goLogin} >登录</button>...</>)

(三)传递参数

1.searchParams(query)参数

useSearchParams v6.23.1 | React Router

通过路径传参

// home.jsx
const navigate = useNavigate()
const goLogin = () => {// 代码跳转路由navigate('/login?name=csq&age=100', { replace: false })}

通过useSearchParams hook接收

import { useSearchParams } from "react-router-dom"
export default function Login(){const [searchParams, setSearchParams] = useSearchParams()const name = searchParams.get('name')const age = searchParams.get('age')return (<><div className="main"><h1>这里是Login页</h1><p>name:{name}</p><p>age:{age}</p></div></>)
}

 这个hook除了获取query参数外,结构还蛮丰富的,甚至还能setSearchParams。。

就是不太清楚具体用处,后面遇到了就补

2.params参数

这种直接用斜杠分隔路径和数据

// home.jsxconst navigate = useNavigate()const goLogin = () => {// params传参navigate('/login/csq/100')}

在router结构里先声明

表示params参数, 表示可选 

    {path:'/login/:name/:age?',element: <Login />,errorElement: <ErrorPage />},

在login组件获取传递来的参数

使用useParams hook获取传递来的params参数,这种方式拿参数比较方便,直接解构就能拿,上一个要一个一个get,有点麻烦 ;不过上一种不需要配置router,蛮难选哈QAQ

import { useParams } from "react-router-dom";
export default function Login(){const {name, age} = useParams()return (<><div className="main"><h1>这里是Login页</h1><p>name:{name}</p><p>age:{age}</p></div></>)
}

(四)新增route配置项

1.loader

loader v6.23.1 | React Router  

在路由组件渲染前使用loader获取数据

可以进行异步操作,如果抛出错误会被useRouteError获取到 

只有data api可以使用该配置 

// router/index.jsx
import Content, { loader as contentLoader } from "../views/Content";
{path: "content",element: <Content />, errorElement: <ErrorPage />,loader: contentLoader,
},

用promise模拟请求失败的情况,在1s后抛出错误,页面被更改为errorpage页面

// content.jsx
// 用于请求
export const loader = async () => {// 模拟请求失败return new Promise((resolve, reject) => {setTimeout(() => {reject('请求失败!')}, 1000)}).then(res => {console.log(res);}).catch(err => {throw (err)})
}export default function Content() {return (<><h1>这里是Content页!!</h1></>)
}

 

2.action

action v6.23.1 | React Router

Route actions are the "writes" to route loader "reads". They provide a way for apps to perform data mutations with simple HTML and HTTP semantics while React Router abstracts away the complexity of asynchronous UI and revalidation. This gives you the simple mental model of HTML + HTTP (where the browser handles the asynchrony and revalidation) with the behavior and UX capabilities of modern SPAs.  

路由操作是对路由加载程序“读取”的“写入”。它们为应用程序提供了一种通过简单的HTML和HTTP语义执行数据突变的方法,而React Router则抽象掉了异步UI和重新验证的复杂性。这为您提供了HTML+HTTP的简单心理模型(其中浏览器处理异步和重新验证)以及现代SPAs的行为和用户体验功能。

。。。说实话有点理解不到,也没理解到和loader的关系。。先都放在这里 后续来补充

3.lazy

lazy v6.23.1 | React Router

照着文档写的懒加载怎么没有用。。

后面再来看看吧 累了 哎

(五)路由守卫

(六)总结

终于学到router了!

今天主要是根据文档学的6.4相关的router,和现在常用的应该还是有点出入,肯定多看看就完事儿了!

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

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

相关文章

这两款kimi和豆包插件,用来辅助文献阅读和总结,太香了!娜姐亲测好用

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 ChatGPT刚出来的时候&#xff0c;几款速读PDF的AI工具ChatDoc、ChatPDF也跟着火了起来&#xff0c;可见大家对于速读文献、总结文档需求很高。 我记得ChatPDF只有几次免费机会…

2024.6.9 七

Python的time库 先导入库 import time相关函数 time.time() 返回当前时间的时间戳(一个记录时间的浮点数),从1970年开始算的 time.localtime(sec) 返回一个指定时间戳(sec)的struct_time对象,是一个元组封装起来的,默认是当地时间 struct_time对象 tm_year 年 tm_mon 月 tm_…

opencv--使用opencv实现旋转角度的模板匹配

下面的例子是简单的使用opencv 实现的模板匹配流程&#xff0c;其中时间性能和精确度还需要调整&#xff0c;如果直接使用会出问题&#xff0c;所以这个只是例子&#xff0c;根据代码原理可以实现尺度变化的模板匹配和旋转尺度变化同时&#xff0c;具体根据实现的旋转代码进一步…

Nacos的配置中心

1.前言 除了注册中心和负载均衡之外, Nacos还是⼀个配置中心, 具备配置管理的功能. Namespace 的常用场景之一是不同环境的配置区分隔离&#xff0c; 例如开发测试环境和⽣产环境的配置隔离。 1.1 为什么需要配置中心&#xff1f; 当前项目的配置都在代码中&#xff0c;会存…

Django 部署指南

部署 Django 应用程序涉及将我们的应用程序从开发环境部署到生产环境&#xff0c;并确保它可以在生产服务器上安全运行和扩展。其实了解几种部署方案&#xff0c;相信你对将来的项目更得心应手。 1、问题背景 Django 是一款流行的 Python Web 框架&#xff0c;但对于新手来说&…

elasticsearch hanlp 插件安装操作

elasticsearch hanlp 插件安装操作 下载 hanlp 插件上传hanlp插件到elasticsearch服务器安装hanlp插件kibana测试 下载 hanlp 插件 这里大家根据自己对应的 elasticsearch 版本下载匹配版本的 hanlp 插件&#xff0c;由于 hanlp 及 elasticsearch 各个版本之间差别较大&#x…

将克隆到本地的6.824项目上传到自己的github

前置知识见&#xff1a;把自己在本地完成的mit6.s081项目上传到自己的github仓库里_mit6.s081 lab上传-CSDN博客 先在github建立一个自己的仓库 由于github可以给自己的主分支改名了&#xff0c;我这次是勾选了创建README文件 在本地同样是建立一条remote分支 git remote add…

Ant Design Vue Table组件全单元格编辑实现方案

在ant上的table常见用法是一行的元素可编辑&#xff0c;如下&#xff1a; 但是现在有一个需求是全部单元格均可编辑&#xff0c;如何实现呢&#xff1f; 表格组件 <a-tablev-if"query.personnel_type 0"size"middle"row-key"id":scroll&qu…

【CS.OS】操作系统如何使用分页和分段技术管理内存

1000.5.CS.OS.1.3-基础-内存管理-操作系统如何使用分页和分段技术管理内存-Created: 2024-06-09.Sunday10:24 操作系统的内存管理是一个复杂而关键的功能&#xff0c;它确保了程序可以高效、安全地运行。虚拟内存管理是其中一个重要的概念&#xff0c;它通过分页和分段技术来实…

Leetcode刷题笔记8

162. 寻找峰值 162. 寻找峰值 - 力扣&#xff08;LeetCode&#xff09; 对于所有有效的 i 都有 nums[i] ! nums[i 1] 解法一&#xff1a;暴力解法 从第一个位置一直向后走&#xff0c;然后分情况即可1. 第二个元素就往下降&#xff0c;那么第一个元素就是峰顶 2. 一直遍历…

温度传感器十大品牌

温度传感器品牌排行榜-十大热电偶品牌-热敏电阻品牌排行-Maigoo品牌榜

k8s面试题大全,保姆级的攻略哦(三)

目录 1、简述ETCD及其特点? 2、简述ETCD适应的场景? 3、简述什么是Kubernetes? 4、简述Kubernetes和Docker的关系? 5、简述Kubernetes中什么是Minikube、Kubectl、Kubelet? 6、简述Kubernetes常见的部署方式? 7、简述Kubernetes如何实现集群管理? 8、简述Kubern…

【C++】函数模板和类模版

目录 前言 模板参数 类型模板参数 非类型模板参数 模板的特化 函数模板的特化 类模板的特化 全特化 偏特化 模板的分离编译 模板总结 前言 函数模板和类模板是C模板编程中的两个核心概念&#xff0c;它们允许程序员编写泛型代码&#xff0c;这些代码可以在多种数据…

月薪70-100k,京东招ML算法工程师和运筹优化专家!

Datawhale分享 推荐&#xff1a;黄玉琳&#xff0c;京东&#xff0c;Datawhale成员 团队介绍 我们是京东零售集团供应链算法优化团队&#xff0c;通过在人工智能与运筹优化领域的持续性技术革新,为京东自营千万级商品提供算法策略支持,实现了以用户为中心的供应链管理和更高效…

攻防世界---misc---BotW-

1、下载附件是一张图片 2、查看图片属性&#xff0c;用winhex分析&#xff0c;没有发现奇怪的地方&#xff0c;用binwalk&#xff0c;接着使用foremost 3、得到两张图片&#xff0c;一张是原图&#xff0c;一张是特殊的字符 4、经过查阅资料得知&#xff0c;这是希卡文字&#…

IPv6 归属地城市级 Api 接口 - 精准定位每一个连接

随着互联网的快速发展&#xff0c;人们对于网络安全和隐私保护的要求也越来越高。在网络世界中&#xff0c;每一个连接都有其特定的地理位置&#xff0c;了解连接的归属地信息对于识别恶意行为以及网络运营具有重要意义。IPv6 归属地城市级 Api 接口就能够实现对连接的精准定位…

复数乘法IP核的使用

一、IP核解析 在这张图片中&#xff0c;我们看到的是一个“Complex Multiplier (6.0)” IP 核的配置界面。以下是各个配置参数的详细说明&#xff1a; 1.1 Multiplier Construction Use LUTs: 选择这个选项时&#xff0c;乘法器将使用查找表&#xff08;LUTs&#xff09;来实现…

Understanding Diffusion Objectives as the ELBO with Simple Data Augmentation

Understanding Diffusion Objectives as the ELBO with Simple Data Augmentation 引言 本文前作 VDM 已经推导出了扩散模型可以将优化 ELBO 作为目标函数。然而现在 FID &#xff08;也就是感知质量&#xff09;最好的模型还是用的其他目标函数&#xff08;如 DDPM 的噪声预…

用AI制作历史解说视频:GPT + MidJourney + PiKa + FunSound + 剪映

1. 项目介绍 最近某站看到一个看到利用AI创作视频解说&#xff0c;成品画面很酷炫。对此以初学者视角进行复现&#xff0c;创意来源&#xff1a;用AI制作历史解说视频 2. 开始创作 我们参照原作者展示的内容&#xff0c;对古代人物屈原来生成解说视频。 2.1 故事脚本分镜 【…