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.rhkb.cn/news/346024.html

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

相关文章

kafka集成SpringBoot api编写教程

1.新建项目 用的idea是20222.1.3版本&#xff0c;没有Spring Initializr 插件&#xff0c;不能直接创建springboot项目 可以在以下网址创建项目&#xff0c;下载后解压&#xff0c;然后用idea打开项目即可 1.1 在 https://start.spring.io/ 上创建项目 1.2上传到linux&#x…

10.2 Go Channel

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

Letcode-Top 100二叉树专题

94. 二叉树的中序遍历 方法一&#xff1a;递归法 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeN…

【python】在【机器学习】与【数据挖掘】中的应用:从基础到【AI大模型】

目录 &#x1f497;一、Python在数据挖掘中的应用&#x1f495; &#x1f496;1.1 数据预处理&#x1f49e; &#x1f496;1.2 特征工程&#x1f495; &#x1f497;二、Python在机器学习中的应用&#x1f495; &#x1f496;2.1 监督学习&#x1f49e; &#x1f496;2.2…

第1章Hello world 3/5:Cargo.lock:确保构建稳定可靠:运行第一个程序

讲动人的故事,写懂人的代码 1.6 Cargo.lock:确保构建稳定可靠 “看!”席双嘉一边指着屏幕一边说,“终端窗口提示符的颜色,从绿变黄了。这就意味着代码在上次提交后有点变化。” 赵可菲:“但是我们只是运行了程序,代码应该没动呀。” 席双嘉敲了下git status -uall,这…

计网总结☞网络层

.................................................. 思维导图 ........................................................... 【Wan口和Lan口】 WAN口&#xff08;Wide Area Network port&#xff09;&#xff1a; 1)用于连接外部网络&#xff0c;如互联…

SpringBoot学习笔记

总体思路&#xff1a;先写dao,再写service 1.https://start.spring.io 生成对应的模板 2.写TestCotroller类&#xff0c;类上写RestCotroller注解 3.TestCotroller类里写方法&#xff0c;方法上写GetMapping("/方法名")注解 4.不一定要写GetMapping,具体看做什么操…

MySQL从入门到高级 --- 15.优化 16.pymysql

文章目录 第十五章 && 第十六章&#xff1a;15.优化15.1 查询SQL执行效率15.2 定位低效率执行SQL15.3 explain分析执行计划 - 基本使用15.4 explain分析执行计划 - id15.5 explain分析执行计划 - select_type15.6 explain分析执行计划 - type15.7 explain分析执行计划 …

MySQL高性能(MySQL锁)

MySQL性能系列 MySQL锁 前言1. 死锁机制2. 思维导图与锁划分介绍3. 粒度划分锁3.1. 全局锁3.2. 页级锁&#xff08;Page-level locking&#xff09;3.3. 表级锁&#xff08;Tables-level lock&#xff09;○ 共享锁&#xff08;表级&#xff09;○ 排他锁&#xff08;表级&…

字节面试:CPU100% 如何处理?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;遇到很多很重要的线上问题的场景题&#xff1a; 1.CPU100%&#xff0c;你是怎么处理的&…

jvm学习笔记(二) ----- 垃圾回收

GC 一、判定对象是否是垃圾1.引用计数法2.可达性分析算法 二、垃圾回收算法1.标记清除2.标记整理3. 复制4. 分代垃圾回收1.尝试在伊甸园分配2.大对象直接晋升至老年代3.多次存活的对象4.老年代连续空间不足&#xff0c;触发 Full GC 链接: jvm学习笔记(一) ----- JAVA 内存 链接…

C++程序设计:对数据文件的操作与文件流

姚老师小课堂开课啦&#xff01; 一、文件的分类&#xff1a; 1.ASCII码文件&#xff1a; ASCII文件使用方便&#xff0c;比较直观&#xff0c;便于阅读&#xff0c;便于对字符进行输入输出&#xff0c;但一般占用存储空间较多&#xff0c;而且需要花费转换时间&#xff08;二…

④-2单细胞学习-cellchat单数据代码补充版(通讯网络)

目录 通讯网络系统分析 ①社会网络分析 1&#xff0c;计算每个细胞群的网络中心性指标 2&#xff0c;识别细胞的信号流模式 ②非负矩阵分解&#xff08;NMF&#xff09;识别细胞的通讯模式 1&#xff0c;信号输出细胞的模式识别 2&#xff0c;信号输入细胞的模式识别 信…

激光点云配准算法——Cofinet / GeoTransforme / MAC

激光点云配准算法——Cofinet / GeoTransformer / MAC GeoTransformer MAC是当前最SOTA的点云匹配算法&#xff0c;在之前我用总结过视觉特征匹配的相关算法 视觉SLAM总结——SuperPoint / SuperGlue 本篇博客对Cofinet、GeoTransformer、MAC三篇论文进行简单总结 1. Cofine…

计算机网络 期末复习(谢希仁版本)第8章

元文件就是一种非常小的文件&#xff0c;它描述或指明其他文件的一些重要信息。这里的元文件保存了有关这个音频/视频文件的信息。 10. 流式&#xff1a;TCP&#xff1b;流式实况&#xff1a;UDP。

10秒钟docker 安装Acunetix

1、拉取镜像&#xff1a; 2、查看镜像&#xff1a; [rootdns-server ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE quay.io/hiepnv/acunetix latest f8415551b8f4 2 months ago 1.98GB 3、运行镜像&#xff1a; …

Redis 单线程问题 BigKey问题

前言 简单的redis基础类型以及常用操作我们都也已经介绍过了 现在今天我们来谈谈redis对于单线程是需要怎么理解的 以及redis假设遇见大key我们需要怎么去查询和删除呢??? redis单线程 假设有个人现在问你一个问题:redis是单线程的还是多线程的 这个问题本身就不严谨 就像问…

Python通过数据验证功能在Excel文件中创建下拉列表

Excel表格的灵活性和功能性深受各行各业人士的喜爱。在Excel表格中&#xff0c;下拉列表功能是提升数据录入效率与准确性的一个重要利器&#xff0c;能够为用户提供预设的选择项&#xff0c;限制输入范围&#xff0c;避免手动输入错误&#xff0c;还能够简化数据录入过程&#…

深度学习(三)

5.Functional API 搭建神经网络模型 5.1利用Functional API编写宽深神经网络模型进行手写数字识别 import numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom sklearn.datasets import load_irisfrom sklearn.model_selection import train_test_splitfrom…

Nginx配置详细解释:(3)http模块及server模块,location模块

目录 环境概述&#xff1a; http模块中的全局模块 1. root配置主要是对主web页面的路径访问。 2.server虚拟主机 2.1基于IP&#xff1a; 2.2基于域名&#xff1a; 3.alias别名 4.location匹配 5.access模块&#xff1a; 6.验证模块 7.自定义错误页面 8.日志存放位置…