react路由参数path不再支持正则?比较v5和v6写法的差异性

文章目录

  • 前言
    • v5方式:直接在path参数中,写入对应正则
      • (1)代码+详细注释如下
      • (2)页面输出如下,会出现undefined的情况
    • v6方式: 在路由对象中配置,但只可配动态路由,不可用正则
      • (1)代码+详细注释如下
      • (2)页面输出如下,不会出现undefined的情况


前言

在React16 Router 5 的时候,路由对象的path是可以使用正则匹配的。但是在React17 Router 6出来的时候,path参数不再支持正则表达式。这是因为在React Router 6中,路由匹配逻辑被重写,使用了一种更快更简单的路径匹配算法。在这里,将会对两种方式进行比对,毕竟有些老项目还是会用router v5的。

v5方式:直接在path参数中,写入对应正则

分析:
(1)这里列举国际化配置,限制父级路由为zh或en
(2)使用useParams获取的时候,父级路由除了/zh和/en,其他情况为undefined,如/hk/page1,获取的时候就是undefined

(1)代码+详细注释如下

// App.tsx 路由部分代码import { BrowserRouter as Router, Route, Switch } from 'react-router-dom'import ChildRoute from './ChildRoute'<Router><Switch><Route path={`/:locale(${zh|en)?`}><ChildRoute /></Route></Switch></Router>// ChildRoute.tsx 路由部分代码/** 使用方式 */import { useParams, Route } from "react-router-dom";
// 这里正则就使用上了,如果不是zh或en,获取到的locale就是undefined
// 所以这里做了个默认值处理,如果undefined,就赋值为zhconsole.log('locale-before', useParams<{ locale?: string }>())const { locale = 'en' } = useParams<{ locale?: string }>()console.log('locale-after', useParams<{ locale?: string }>())

(2)页面输出如下,会出现undefined的情况

在这里插入图片描述

v6方式: 在路由对象中配置,但只可配动态路由,不可用正则

分析:
(1)配置动态路由 :locale
(2)如果要限制只能是zh或en,需要在获取时,判断locale的值,因为此时locale不会为空
(3)由于无法正则配置动态路由参数,所以页面不存在重定向就要再做下限制

(1)代码+详细注释如下

// @/router/index.tsx
import { lazy } from "react";
import { Navigate, RouteObject } from "react-router-dom";
const Layout = lazy(() => import("@/layout"));
const Home = lazy(() => import("@/pages/Home"));
const Page2 = lazy(() => import("@/pages/Page2"));
// 配置动态路由
const routes: RouteObject[] = [{path: "/",element: <Navigate to={`/zh/home`} />,},{path: "/:locale",element: <Navigate to={`/zh/home`} />,},{path: "/:locale",element: <Layout />,children: [// 其他子路由配置{path: "/:locale/home",element: <Home />,},{path: "/:locale/page2",element: <Page2 />,},],},
];
export default routes;// layout页面使用
import { useEffect } from "react";
import { useParams, Outlet, Navigate } from "react-router-dom";
const LayOut = () => {const { locale } = useParams(); // 获取当前语言console.log("useParams----layout", useParams());// 父级路由locale不为zh|en,并且不是404,重定向到404if (locale && !["zh", "en"].includes(locale) && locale !== "404") {return <Navigate to={`/404`} />;} else {return (<><div>头部</div><Outlet /><div>尾部</div></>);}
};
export default LayOut;

(2)页面输出如下,不会出现undefined的情况

在这里插入图片描述

注:useParams仅在使用react-router-dom的Route组件内部时才有效,而在组件树中的其他位置调用会报错

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

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

相关文章

TH方程学习(4)

一、背景介绍 在本节将会对TH方程打包成一个函数&#xff0c;通过输入目标星的轨道要素&#xff0c;追踪星在目标星VVLH坐标系下的相对位置和速度&#xff0c;以及预报的时间&#xff0c;得到预报时刻追踪星在VVLH坐标系下的位置和速度&#xff0c;以及整个状态转移矩阵。 合并…

替换所有的问号 ---- 模拟

题目链接 题目: 分析: 我们只需要遍历字符串, 将所有?进行修改即可但是需要判断, 修改的字符不能和前面后面重复同时, 有一个细节需要处理, 就是当?在最前面时, 没有前面的符号需要判断 在最后面的时候, 没有后面的字符需要判断 代码: class Solution {public String mod…

Django ORM深度游:探索多对一、一对一与多对多数据关系的奥秘与实践

系列文章目录 Django入门全攻略&#xff1a;从零搭建你的第一个Web项目Django ORM入门指南&#xff1a;从概念到实践&#xff0c;掌握模型创建、迁移与视图操作Django ORM实战&#xff1a;模型字段与元选项配置&#xff0c;以及链式过滤与QF查询详解Django ORM深度游&#xff…

面试题--this关键字

this 指向是前端面试中的常问题型&#xff0c;简单分析为以下几种&#xff1a; 1. 在全局作用域中&#xff0c;this 关键字固定指向全局对象 window 或者 global。 2. 在函数作用域中&#xff0c;取决于函数是如何被调用的。 1&#xff09;函数直接调用&#xff0c;this 指向…

Leetcode 3169. Count Days Without Meetings

Leetcode 3169. Count Days Without Meetings 1. 解题思路2. 代码实现 题目链接&#xff1a;3169. Count Days Without Meetings 1. 解题思路 这一题的话我们只需要先对meeting的时间进行一下排序&#xff0c;然后不断更新当前连续开会的时间即可。当某一个会议开始时&#…

Java中lambda表达式是啥怎么使用

在Java中&#xff0c;Lambda表达式&#xff08;也称为闭包&#xff09;是一种简洁地表示匿名函数&#xff08;即没有名称的函数&#xff09;的方式。它们允许你将函数作为参数传递或赋值给变量&#xff0c;从而简化代码。Lambda表达式在Java 8及更高版本中引入。 Lambda表达式…

打造智能化未来:智能运维系统架构解析与应用实践

在数字化转型的大背景下&#xff0c;智能运维系统成为了企业提升效率、降低成本、增强安全性的关键利器。本文将深入探讨智能运维系统的技术架构&#xff0c;介绍其核心要素和应用实践&#xff0c;帮助读者全面了解智能运维系统的概念、优势和应用价值。 ### 1. 智能运维系统的…

如何进入 -MGMTDB目录

想想这个问题&#xff0c;大家可能觉得很简单吧&#xff0c;先不看答案&#xff0c;你试一试如何进去 1.问题现象&#xff1a; 我直接进入&#xff1a; cd -MGMTDB 直接就报错了&#xff1a; [gridhost03 _mgmtdb]$ cd -MGMTDB -bash: cd: -M: invalid option cd: usage: c…

Rust struct

Rust struct 1.实例化需要初始化全部成员变量2.如果需要实例化对象可变&#xff0c;加上mut则所有成员变量均可变 Rust支持通过已实例化的对象&#xff0c;赋值给未赋值的对象的成员变量 #![allow(warnings)] use std::io; use std::error::Error; use std::boxed::Box; use s…

【NumPy】深入解析numpy中的 iscomplex 方法

&#x1f308; 欢迎莅临我的个人主页&#x1f448;这里是我深耕Python编程、机器学习和自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;并乐于分享知识与经验的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a; 我是云天徽上&#xff0c;一名对技…

下载文件流

export function downloadFile(file, name, type) { const link document.createElement(‘a’) link.href window.URL.createObjectURL(new Blob([file], { type: type })) link.target ‘_blank’ link.download name document.body.appendChild(link) link.click() docu…

Mujoco仿真【xml文件的学习 4】

在学习Mujoco仿真的过程中&#xff0c;mujoco的版本要选择合适。先前我将mujoco的版本升级到了mujoco-3.1.4&#xff0c;在运行act的仿真代码时遇到了问题&#xff0c;撰写了博客&#xff1a; Aloha机械臂的mujoco仿真问题记录-CSDN博客 下面在进行mujoco仿真时&#xff0c;统…

从0开发一个Chrome插件:开发Chrome插件的必要知识

前言 这是《从0开发一个Chrome插件》系列的第二篇文章,本系列教你如何从0去开发一个Chrome插件,每篇文章都会好好打磨,写清楚我在开发过程遇到的问题,还有开发经验和技巧。 专栏: 从0开发一个Chrome插件:什么是Chrome插件? 尽请期待~ Chrome 插件的基本结构 一个C…

Superset二次开发之PG数据库备份策略

背景:基于Superset项目3.0版本二次开发,线上运行之后,需要处理和维护后续的PG数据的备份,迁移,回滚,校验等环节 Superset 默认使用 PostgreSQL(简称 PG)作为其元数据数据库。这个数据库在 Superset 项目中扮演了关键角色: 存储元数据: PG 数据库存储 Superset 的所有…

十_信号3-可重入函数

如上图所示链表&#xff0c;在插入节点的时候捕获到了信号&#xff0c;并且该信号的自定义处理方式中也调用了插入节点的函数。 在main函数中&#xff0c;使用insert向链表中插入一个节点node1&#xff0c;在执行insert的时&#xff0c;刚让头节点指向node1以后(如上图序号1)&…

MySQL学习——获取数据库和表格的信息

如果忘记了数据库或表的名称&#xff0c;或者不确定给定表的结构&#xff08;例如&#xff0c;其列的名称&#xff09;&#xff0c;该怎么办呢&#xff1f;MySQL通过几个语句解决了这个问题&#xff0c;这些语句提供了有关它支持的数据库和表的信息。 你之前已经看过SHOW DATA…

linux系统下,mysql增加用户

首先&#xff0c;在linux进入mysql mysql -u root -p 然后查看当前用户&#xff1a; select user,host from user; 增加用户语句&#xff1a; CREATE USER 用户名host范围 IDENTIFIED BY 密码;

【操作系统】Linux、Windows各平台CoreDump机制实现详解

LinuxCoreDump机制是Unix/Linux操作系统中的一种功能&#xff0c;它允许在程序异常终止时&#xff0c;将程序的内存状态保存到一个文件中&#xff0c;这个文件通常被称为core文件。以下是CoreDump机制的原理和实现步骤&#xff1a; 信号触发&#xff1a;CoreDump通常由特定的信…

【C++】C++入门1.0

鼠鼠最近在学C&#xff0c;那么好&#xff0c;俺来做笔记了&#xff01; 目录 1.C关键字(C98) 2.命名空间 2.1.命名空间定义 2.2.命名空间的使用 3.C的输入&&输出 4.缺省参数 4.1缺省参数概念 4.2.缺省参数的分类 5.函数重载 5.1.函数重载概念 5.2.C支持函数…

深度学习-04-数值的微分

深度学习-04-数值的微分 本文是《深度学习入门2-自製框架》 的学习笔记&#xff0c;记录自己学习心得&#xff0c;以及对重点知识的理解。如果内容对你有帮助&#xff0c;请支持正版&#xff0c;去购买正版书籍&#xff0c;支持正版书籍不仅是尊重作者的辛勤劳动&#xff0c;也…