React-router-dom v6和 v5版本“注册路由”的差异化

React-router-dom v6和 v5版本“注册路由”的差异化

Matched leaf route at location “/about” does not have an element. This
means it will render an with a null value by default
resulting in an “empty” page.

v6版本中Switch已经被换成了Routes,点击链接路径变化正常但页面不显示,并在浏览器控制台输出以上警告。

解决方法:

原来“注册路由”代码:

现在的代码:

<Route path=“/about” element={}/>

<Route path=“/home” element={}/>

总结React-router-dom从v5升级到v6:
React-router-dom从v5升级到v6有了一些变化:

(2) Switch重命名位Routes

// v5
<Switch><Route exact path="/"><Home /></Route><Route path="/profile"><Profile /></Route>
</Switch>// v6
<Routes><Route path="/" element={<Home />} /><Route path="profile/*" element={<Profile />} />
</Routes>

(2) Route 的新特性变更 ,component/render被element替代

import Profile from ‘./Profile’;

// v5
<Route path=":userId" component={Profile} />
<Routepath=":userId"render={routeProps => (<Profile routeProps={routeProps} animate={true} />)}
/>// v6
<Route path=":userId" element={<Profile />} />
<Route path=":userId" element={<Profile animate={true} />} />

(3) 嵌套路由变得更简单

具体变化有以下:

Route children 已更改为接受子路由。 比Route exact 和 Route strict更简单的匹配规则。 Route
path 路径层次更清晰。

v5 中的嵌套路由必须非常明确定义,且要求在这些组件中包含许多字符串匹配逻辑.

// v5
import {BrowserRouter,Switch,Route,Link,useRouteMatch
} from 'react-router-dom';function App() {return (<BrowserRouter><Switch><Route exact path="/" component={Home} /><Route path="/profile" component={Profile} /></Switch></BrowserRouter>);
}function Profile() {let { path, url } = useRouteMatch();return (<div><nav><Link to={`${url}/me`}>My Profile</Link></nav><Switch><Route path={`${path}/me`}><MyProfile /></Route><Route path={`${path}/:id`}><OthersProfile /></Route></Switch></div>);
}

v6 中,你可以删除字符串匹配逻辑。不需要任何 useRouteMatch()

// v6
import {BrowserRouter,Routes,Route,Link,Outlet
} from 'react-router-dom';function App() {return (<BrowserRouter><Routes><Route path="/" element={<Home />} /><Route path="profile/*" element={<Profile/>} /></Routes></BrowserRouter>);
}function Profile() {return (<div><nav><Link to="me">My Profile</Link></nav><Routes><Route path="me" element={<MyProfile />} /><Route path=":id" element={<OthersProfile />} /></Routes></div>);
}

当然,还有更酸爽的操作,直接在路由里定义的,然后用接下来的一个新API:Outlet

新API:Outlet

function App() {return (<BrowserRouter><Routes><Route path="/" element={<Home />} /><Route path="profile" element={<Profile />}><Route path=":id" element={<MyProfile />} /><Route path="me" element={<OthersProfile />} /></Route></Routes></BrowserRouter>);
}function Profile() {return (<div><nav><Link to="me">My Profile</Link></nav>{/* 将直接根据上面定义的不同路由参数,渲染<MyProfile /> 或 <OthersProfile /> */}<Outlet /></div>)
}

多个 Routes
以前,我们只能在 React App 中使用一个 Routes。但是现在我们可以在 React App 中使用多个路由,这将帮助我们基于不同的路由管理多个应用程序逻辑。

import React from 'react';
import { Routes, Route } from 'react-router-dom';function Dashboard() {return (<div><p>Look, more routes!</p><Routes><Route path="/" element={<DashboardGraphs />} /><Route path="invoices" element={<InvoiceList />} /></Routes></div>);
}function App() {return (<Routes><Route path="/" element={<Home />} /><Route path="dashboard/*" element={<Dashboard />} /></Routes>);
}

(4) 用 useNavigate 代替 useHistory

// v5
import { useHistory } from 'react-router-dom';function MyButton() {let history = useHistory();function handleClick() {history.push('/home');};return <button onClick={handleClick}>Submit</button>;
};
// v6
import { useNavigate } from 'react-router-dom';function MyButton() {let navigate = useNavigate();function handleClick() {navigate('/home');};return <button onClick={handleClick}>Submit</button>;
};

history的用法也将被替换成navigate

// v5
history.push('/home');
history.replace('/home');// v6
navigate('/home');
navigate('/home', {replace: true});

(5) 新钩子 useRoutes 代替 react-router-config

function App() {let element = useRoutes([{ path: '/', element: <Home /> },{ path: 'dashboard', element: <Dashboard /> },{ path: 'invoices',element: <Invoices />,children: [{ path: ':id', element: <Invoice /> },{ path: 'sent', element: <SentInvoices /> }]},// 重定向{ path: 'home', redirectTo: '/' },// 404找不到{ path: '*', element: <NotFound /> }]);return element;
}

(6) 大小减少:从20kb到8kb
React Router v6给我们带来方便的同时,还把包减少了一半以上的体积

如果对你有帮助,可以点点关注点点赞谢谢哈!

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

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

相关文章

【软考】信息系统项目管理师论文方向猜想

报喜不报忧&#xff0c;每天都在为鸡零狗碎推诿扯皮&#xff0c;属实是有辱师门。 通过软考&#xff0c;目前算是真正有意义的事情。 虽然都说高项的论文是个玄学&#xff0c;但是道听途说了一些通关感想还是蛮有启发的。 文件要求 参考了一份广西省高级工程师评审的文件&am…

Leetcode704二分查找、折半查找(Java实现)

好久没有更新算法题&#xff0c;今天来写一道二分查找的题目。题目要求如下&#xff0c; 那么这道题的解题思路如下&#xff0c;我们寻找的过程是首先去访问数组的中间位置mid&#xff0c;如果nums[mid]大于了targe那么说明&#xff0c;我们要找的数在mid的左半边&#xff0c;…

IAR开发stm8系列,C语言实现16位乘法器和32位除法器函数

stm8是8位单片机&#xff0c;在ADC采样采用12bit采样值进行定点整型运算的时候&#xff0c;为了保证精度需要通过16位乘法器 进行扩大&#xff0c;通过32位除法器缩小运算。但是用c语言直接用“*"和"/"计算是无法实现。c语言的math函数库也没有提供这样的计算函…

CSDN博客迁移至Hexo

实现思路&#xff1a; 获取博客列表获取博客详情解析博客详情html&#xff0c;找出 #article_content部分通过jsoup解析博客内容&#xff0c;转成md格式文件 依赖 <dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</art…

Linux实用操作篇-下篇

Linux实用操作篇-上篇&#xff1a;Linux实用操作-上篇-CSDN博客 一、网络传输 1.1 ping命令 网络是否可联通 可以通过ping命令&#xff0c;检查指定的网络服务器是否是可联通状态 语法: ping [-c num] ip或主机名 选项&#xff1a;-c&#xff0c;检查的次数&#xff0c;…

嵌入式SOC芯片选型

摘要&#xff1a; 本文主要探讨的是如果涉及芯片选型&#xff0c;需要考虑哪些方面&#xff1f; 将相关的需求列出来&#xff0c;供后续实践的时候参考。 SOC芯片选型 能力参数指标备注算力编码能力VPU处理能力YUV算法资源媒体audiovideoCPU运行主频架构DDRDDR规格DDR带宽DD…

cmake常用设置命令及参数大全

CMake是一个跨平台的开源构建工具,用于管理软件项目的构建过程。它使用简单的配置文件(CMakeLists.txt)来定义构建过程的规则。 以下是一些常用的CMake设置和命令: 1. cmake_minimum_required(VERSION x.x):指定需要的CMake版本。 2. project(project_name):设置项目的…

深入理解Java虚拟机---垃圾收集算法

深入理解Java虚拟机---垃圾收集算法 如何判定对象是否存活引用计数法可达性分析法 Java引用类型垃圾回收算法标记-清除算法复制算法标记-整理算法分代收集算法 HotSpot的算法实现枚举根节点安全点安全区域 如何判定对象是否存活 引用计数法 引用计数算法利用额外的内存空间来…

Dockerfile创建镜像介绍

1.介绍 Docker 提供了一种更便捷的方式&#xff0c;叫作 Dockerfile&#xff0c;docker build命令用于根据给定的Dockerfile构建Docker镜像。 docker build语法&#xff1a; # docker build [OPTIONS] <PATH | URL | -> 常用选项说明 --build-arg&#xff0c;设置构建时的…

上海亚商投顾:沪指探底回升 AI应用方向再度爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数昨日探底回升&#xff0c;早盘一度均跌超1%&#xff0c;午后集体拉升翻红&#xff0c;深成指、创业板…

FFmpeg的AVcodecParser

文章目录 结构体操作函数支持的AVCodecParser 这个模块是AVCodec中的子模块&#xff0c;专门用来提前解析码流的元数据&#xff0c;为后面的解码做准备&#xff0c;这一点对cuda-NVdec非常明显&#xff0c;英伟达解码器的元数据解析是放在CPU上的&#xff0c;所以就非常依赖这个…

为什么Vue3的proxy需要Reflect呢

何为proxy Proxy 对象用于定义或修改某些操作的自定义行为&#xff0c;可以在外界对目标对象进行访问前&#xff0c;对外界的访问进行改写。 var proxy new Proxy(target, handler)ES6 中的proxy目前提供了13种可代理操作拦截的行为。 何为reflect ES6 标准中&#xff0c;…

远程工作:自由职业者如何成功赚钱

前言 在这个不断进步的数字化时代&#xff0c;远程工作已经从一个可选的边缘工作方式&#xff0c;成长为主流职业趋势的一部分。特别是自从全球疫情改变了我们的生活和工作方式以来&#xff0c;远程工作的概念不再是遥不可及的理想&#xff0c;而是已经成为许多人日常工作的现…

SpringBoot集成swagger2配置权限认证参数

作者简介&#xff1a;大家好&#xff0c;我是撸代码的羊驼&#xff0c;前阿里巴巴架构师&#xff0c;现某互联网公司CTO 联系v&#xff1a;sulny_ann&#xff08;17362204968&#xff09;&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗…

[Java][JDK5]可变参数

我们可以假设一种情况&#xff0c;我们需要进行求和计算 在原先&#xff0c;我们考虑到参数只能传入一个数字&#xff0c;因此我们会将需要求和的数字放在一个数组&#xff0c;传入该数组进入方法再拆分计算 比如下面的例子:使用了增强for来对数组进行遍历 public class Mai…

【Lidar】基于Python的三维点云数据转二维平面+散点图绘制

最近一直在搞点云相关的操作&#xff0c;有时候在处理点云数据时需要查看处理后的数据是否满足需求&#xff0c;所以就想着写一套展示点云的代码。之前已经分享过如何可视化点云了&#xff0c;感兴趣的可以自己去看下&#xff1a;【Lidar】基于Python的Open3D库可视化点云数据。…

golang https server如何设计方便抓包定位且安全

代码 测试 用go写后端https服务时&#xff0c;需要定位https包中的内容是否符合预期。 有涉猎的朋友应该了解过https有一种keylog技术&#xff0c;它允许在HTTPS连接中捕获和记录SSL或TLS会话密钥&#xff0c;以便于调试和分析加密流量。 本文将的就是通过可控制开启和关闭的…

单身狗(Python)

题目描述 单身狗 “单身狗”是中文对于单身人士的一种爱称。本题请你从上万人的大型派对中找出落单的客人&#xff0c;以便给予特殊关爱。 输入格式&#xff1a; 输入第一行给出一个正整数 N&#xff08;≤50000&#xff09;&#xff0c;是已知夫妻/伴侣的对数&#xff1b;…

CPU 混合推理,非常见大模型量化方案:“二三五六” 位量化

本篇文章聊聊网上聊的比较少的具体量化操作&#xff0c;非常见整型位数的量化&#xff0c;来自让各种开源模型能够在 CPU 环境、CPU & GPU 环境混合推理的技术方案&#xff1a;llama.cpp 。 写在前面 接下来&#xff0c;有计划分享一些关于各种开源模型的实践内容。为了能…

安装ThingBox Eclipse Plugin

1. ChatGPT问 The latest version of the ThingBox Eclipse Plugin requires Eclipse IDE 2021-06 or later. 2. PTC官网下载 MED-61378-CD-092_F000_Eclipse-Plugin-9-0-1.zip文件, 和 MED-61098-CD-085_F000_ThingWorx-Extension-SDK-8-5-0&#xff08;需要账号&#xff09…