React Router v6:路由管理的最新进展

2024-05-27 21:36

本文主要是介绍React Router v6:路由管理的最新进展,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

React Router v6 是 React 应用程序路由管理的一个重大更新,它引入了许多改进和简化,包括对嵌套路由的更友好处理,以及对钩子函数的使用。

2500G计算机入门到高级架构师开发资料超级大礼包免费送!

1. Routes 重构

在 v6 中,<Route> 组件被替换为 <Routes> 组件,后者用于包裹所有路由。此外,Switch 组件不再存在,因为 <Routes> 已经实现了类似于 Switch 的行为,只会匹配并渲染第一个匹配的路由。

import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';function App() {return (<Router><Routes><Route path="/" element={<Home />} /><Route path="/about" element={<About />} /><Route path="/users/*" element={<Users />} /> {/* 通配符支持 */}</Routes></Router>);
}

2. 使用 element 属性

路由现在通过 element 属性指定要渲染的组件,而不是通过 componentrender 函数。

<Route path="/profile/:userId" element={<Profile />} />

3. Hook API

React Router v6 引入了新的钩子函数,如 useHistory, useLocation, useParams, 和 useNavigate,这些钩子允许在组件内部直接处理导航。

import { useParams } from 'react-router-dom';function Profile() {const { userId } = useParams();return <div>Profile of user {userId}</div>;
}

4. navigate 函数

useNavigate 钩子返回一个 navigate 函数,用于在组件内部导航。

import { useNavigate } from 'react-router-dom';function ProfileForm() {const navigate = useNavigate();const handleSubmit = (event) => {event.preventDefault();// 提交表单后导航到另一个页面navigate('/success', { replace: true }); // 替换当前历史记录};return <form onSubmit={handleSubmit}>...</form>;
}

5. 懒加载和代码分割

React Router v6 支持动态导入,这有助于实现代码分割,提高应用的加载速度。

<Route path="/lazy" element={import('./LazyComponent').then((mod) => mod.LazyComponent)} />

6. 404 页面

处理未找到的路由,可以设置一个通配符路由来捕获所有未匹配的路径。

<Route path="*" element={<Error404 />} />

7. 嵌套路由

嵌套路由的处理更加简洁,使用 Routes 和 Route 的组合即可。

function App() {return (<Router><Routes><Route path="/" element={<MainLayout />}><Route index element={<Home />} /><Route path="about" element={<About />} /><Route path="users" element={<Users />}><Route path=":userId" element={<User />} /></Route></Route><Route path="*" element={<Error404 />} /></Routes></Router>);
}

8. 路由保护和权限控制

在React Router v6中,可以使用 useEffectuseLayoutEffect 钩子以及 useNavigate 来实现路由保护,确保用户在登录后才能访问受保护的路由。

import { useNavigate, useLocation } from 'react-router-dom';function PrivateRoute({ children }) {const location = useLocation();const navigate = useNavigate();useEffect(() => {if (!isAuthenticated()) {navigate('/login', { replace: true });}}, [navigate]);return isAuthenticated() ? children : null;
}function App() {return (<Router><Routes><Route path="/" element={<PublicRoute><Home /></PublicRoute>} /><Route path="/dashboard" element={<PrivateRoute><Dashboard /></PrivateRoute>} /><Route path="/login" element={<Login />} /></Routes></Router>);
}

在这个例子中,isAuthenticated() 是一个假设的函数,检查用户是否已登录。如果用户未登录,他们将被重定向到登录页面。

9. 重定向和重定位

在 v6 中,可以使用 Navigate 组件来实现重定向。它类似于一个特殊的元素,会触发导航到指定的URL。

import { Navigate } from 'react-router-dom';function PrivateRoute({ children }) {if (!isAuthenticated()) {return <Navigate to="/login" replace />;}return children;
}

10. 路由参数和查询字符串

在 v6 中,你可以使用 useParams 钩子获取路由参数,使用 useLocation 获取查询字符串。

import { useParams, useLocation } from 'react-router-dom';function Profile() {const { userId } = useParams();const query = new URLSearchParams(useLocation().search);const searchParam = query.get('paramName');return <div>Profile of user {userId} with search param: {searchParam}</div>;
}

11. 自定义路由匹配

React Router v6 允许你通过 path-to-regexp 库自定义路由匹配规则,但通常情况下,标准的路径模式已经足够使用。

12. 高阶组件(HoC)

尽管 v6 中不再推荐使用高阶组件,但你仍然可以通过包装组件来实现特定逻辑,如路由保护。

function PrivateRoute({ children }) {if (!isAuthenticated()) {return <Navigate to="/login" replace />;}return <>{children}</>;
}function App() {return (<Router><Routes><Route path="/" element={<PublicRoute><Home /></PublicRoute>} /><Route path="/dashboard" element={<PrivateRoute><Dashboard /></PrivateRoute>} /><Route path="/login" element={<Login />} /></Routes></Router>);
}

13. 路由事件

React Router v6 提供了一些生命周期事件,如 useRouteMatchuseLocationuseHistoryuseNavigate。这些钩子可以帮助你在组件中监听路由变化并做出响应。

import { useLocation } from 'react-router-dom';function Navbar() {const location = useLocation();useEffect(() => {console.log(`Navigated to ${location.pathname}`);}, [location]);return /* ... */;
}

14. 路由配置的模块化

为了保持代码的整洁,你可以将路由配置分散到多个模块中,然后在主配置文件中导入并合并它们。

// routes/users.js
export default [{ path: '/users', element: <UsersList /> },{ path: '/users/:id', element: <UserProfile /> },
];// routes/admin.js
export default [{ path: '/admin/dashboard', element: <AdminDashboard /> },{ path: '/admin/users', element: <AdminUsers /> },
];// App.js
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import usersRoutes from './routes/users';
import adminRoutes from './routes/admin';function App() {return (<Router><Routes>{usersRoutes.map((route, index) => (<Route key={index} {...route} />))}{adminRoutes.map((route, index) => (<Route key={index} {...route} />))}{/* 错误页面或404页面 */}<Route path="*" element={<ErrorPage />} /></Routes></Router>);
}

15. 路由守卫(Guard)

你可以创建自定义的守卫函数来决定用户是否可以访问某个路由。这通常用于实现权限验证或数据预加载。

function requireAuth(nextState, replace) {if (!isAuthenticated()) {replace({pathname: '/login',state: { nextPathname: nextState.location.pathname },});}
}// 在路由中使用
<Route path="/protected" onEnter={requireAuth} component={ProtectedComponent} />

在 v6 中,可以使用 useEffect 或 useLayoutEffect 钩子来实现类似的功能。

16. 路由嵌套

虽然在 v6 中不再需要显式地包裹 Switch 组件,但嵌套路由的概念仍然存在。你可以通过在路由配置中嵌套 Routes 来实现。

function App() {return (<Router><Routes><Route path="/" element={<MainLayout />}><Route index element={<Home />} /><Route path="about" element={<About />} /><Route path="users" element={<Users />}><Route path=":userId" element={<User />} /></Route></Route><Route path="*" element={<Error404 />} /></Routes></Router>);
}

在这个例子中,/users/:userId 路由是在 /users 路由内部定义的,这意味着在访问 /users/someId 时,Users 组件会被渲染,同时 User 组件也会被渲染。

17. 自定义错误处理

React Router v6 不再提供全局错误处理,但你可以通过监听 window.onError 或使用自定义中间件来实现。

18. 代码分割和懒加载

React Router v6 与 Webpack 或其他打包工具很好地配合,可以实现代码分割和懒加载。你可以使用 import() 动态导入组件来实现这一点。

<Routepath="/lazy"element={import('./LazyComponent').then((mod) => mod.LazyComponent).catch((error) => <ErrorBoundary error={error} />)}
/>

19. 自定义路由组件

虽然 Route 组件在 v6 中已经非常简单,但你仍然可以创建自己的组件来扩展其功能,例如添加自定义的加载指示器。

20. 服务器端渲染(SSR)

React Router v6 支持服务器端渲染,但需要额外的配置和库,如 react-router-dom/serverreact-router-dom/browser

2500G计算机入门到高级架构师开发资料超级大礼包免费送!

这篇关于React Router v6:路由管理的最新进展的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1008660

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

【 html+css 绚丽Loading 】000046 三才归元阵

前言:哈喽,大家好,今天给大家分享html+css 绚丽Loading!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 📚一、效果📚二、信息💡1.简介:💡2.外观描述:💡3.使用方式:💡4.战斗方式:💡5.提升:💡6.传说: 📚三、源代码,上代码,可以直接复制使用🎥效果🗂️目录✍️

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同

安全管理体系化的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上进行简单的操作,就可以实现全视频的接入及布控。摄像头管理模块用于多种终端设备、智能设备的接入及管理。平台支持包括摄像头等终端感知设备接入,为整个平台提

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

Vue3项目开发——新闻发布管理系统(六)

文章目录 八、首页设计开发1、页面设计2、登录访问拦截实现3、用户基本信息显示①封装用户基本信息获取接口②用户基本信息存储③用户基本信息调用④用户基本信息动态渲染 4、退出功能实现①注册点击事件②添加退出功能③数据清理 5、代码下载 八、首页设计开发 登录成功后,系统就进入了首页。接下来,也就进行首页的开发了。 1、页面设计 系统页面主要分为三部分,左侧为系统的菜单栏,右侧

【VUE】跨域问题的概念,以及解决方法。

目录 1.跨域概念 2.解决方法 2.1 配置网络请求代理 2.2 使用@CrossOrigin 注解 2.3 通过配置文件实现跨域 2.4 添加 CorsWebFilter 来解决跨域问题 1.跨域概念 跨域问题是由于浏览器实施了同源策略,该策略要求请求的域名、协议和端口必须与提供资源的服务相同。如果不相同,则需要服务器显式地允许这种跨域请求。一般在springbo