React Router v6配置路由守卫

devtools/2025/2/2 4:14:08/

首先准备好以下页面

登录页:用户可以在此页面登录。
受保护页:只有登录的用户可以访问,否则会重定向到登录页。
公共页面:不需要鉴权,任何人都可以访问。

1. 安装依赖
首先,我们需要安装 react-router-dom:
npm install react-router-dom
2. 设置鉴权逻辑
使用 React Context 来管理用户的登录状态(模拟鉴权)。创建一个简单的 AuthContext 来保存和提供用户的登录信息。

//AuthContext.jsimport React, { createContext, useContext, useState } from 'react';// 创建 AuthContext
const AuthContext = createContext();// 提供 AuthContext 的自定义 Hook
export const useAuth = () => {return useContext(AuthContext);
};// 创建 AuthProvider 来管理用户认证状态
export const AuthProvider = ({ children }) => {const [isAuthenticated, setIsAuthenticated] = useState(false);const login = () => setIsAuthenticated(true);const logout = () => setIsAuthenticated(false);return (<AuthContext.Provider value={{ isAuthenticated, login, logout }}>{children}</AuthContext.Provider>);
};

 3. 配置路由守卫
在 React Router v6 中,路由守卫通过 Navigate 组件进行重定向。我们需要创建一个 PrivateRoute 组件来作为守卫,用于保护受限制的页面。

//PrivateRoute.jsimport React from 'react';
import { Navigate } from 'react-router-dom';
import { useAuth } from './AuthContext';// PrivateRoute 组件用于保护需要认证的路由
const PrivateRoute = ({ element }) => {const { isAuthenticated } = useAuth();if (!isAuthenticated) {// 如果用户未认证,重定向到登录页面return <Navigate to="/login" />;}return element;
};export default PrivateRoute;

 4. 创建页面组件
需要三个页面:登录页、受保护页和公共页面。

//LoginPage.jsimport React, { useState } from 'react';
import { useAuth } from './AuthContext';
import { useNavigate } from 'react-router-dom';const LoginPage = () => {const [username, setUsername] = useState('');const { login } = useAuth();const navigate = useNavigate();const handleLogin = () => {// 这里可以做更复杂的验证if (username) {login(); // 登录navigate('/protected'); // 登录后跳转到受保护页}};return (<div><h2>Login Page</h2><inputtype="text"placeholder="Enter username"value={username}onChange={(e) => setUsername(e.target.value)}/><button onClick={handleLogin}>Login</button></div>);
};export default LoginPage;
//ProtectedPage.jsimport React from 'react';
import { useAuth } from './AuthContext';const ProtectedPage = () => {const { logout } = useAuth();return (<div><h2>Protected Page</h2><p>This page is only accessible after login.</p><button onClick={logout}>Logout</button></div>);
};export default ProtectedPage;
//PublicPage.jsimport React from 'react';const PublicPage = () => {return (<div><h2>Public Page</h2><p>This page is accessible to everyone.</p></div>);
};export default PublicPage;

5. 配置路由
配置 App.js,并使用 BrowserRouter 和 Routes 来定义路由。
 

//App.jsimport React from 'react';
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import { AuthProvider } from './AuthContext';
import LoginPage from './LoginPage';
import ProtectedPage from './ProtectedPage';
import PublicPage from './PublicPage';
import PrivateRoute from './PrivateRoute';const App = () => {return (<AuthProvider><Router><Routes><Route path="/" element={<PublicPage />} /><Route path="/login" element={<LoginPage />} />{/* 使用 PrivateRoute 保护受保护页 */}<Routepath="/protected"element={<PrivateRoute element={<ProtectedPage />} />}/></Routes></Router></AuthProvider>);
};export default App;

6. 代码解释
AuthContext.js:提供一个简单的上下文 (AuthContext),用于管理用户的认证状态,包括登录 (login) 和登出 (logout) 操作。
PrivateRoute.js:通过 PrivateRoute 组件来保护受保护的页面。如果用户未登录,自动重定向到登录页面。
页面组件:登录页、受保护页和公共页面通过普通的 React 组件实现。登录页允许用户输入用户名并登录,受保护页需要用户登录才能访问,公共页面可以供所有用户访问。
App.js:在 App.js 中使用 React Router 的 Routes 来配置路由,并根据需要使用 PrivateRoute 来保护需要鉴权的页面。

总结
使用 React Router v6 配置路由守卫。
使用 React Context 来管理认证状态,并通过 Navigate 组件来控制页面访问权限。
PrivateRoute 是路由守卫的核心,它根据用户的认证状态来决定是否允许访问某些受保护的页面。
这种方式适用于构建具有基本鉴权逻辑的 React 应用,适合大部分的需求。
 


http://www.ppmy.cn/devtools/155337.html

相关文章

Java算法——排序

目录 引言1. 插入排序1.1 基本思想1.2 直接插入排序1.3 希尔排序 2. 选择排序2.1 基本思想2.2 直接选择排序2.3 直接选择排序变种2.4 堆排序 3. 交换排序3.1 基本思想3.2 冒泡排序3.3 快速排序3.3.1 快速排序的基本结构3.3.2 Hoare法3.3.3 挖坑法3.3.4 双指针法 3.4 快速排序非…

【ArcMap零基础训练营】02 MODIS数据的下载与处理

MODIS数据处理 230107直播录像 MODIS数据下载及处理 MODIS数据简介 中分辨率成像光谱仪&#xff08;The Moderate Resolution Imaging Spectroradiometer &#xff0c;MODIS&#xff09;是地球观测系统&#xff08;EOS&#xff09;Terra和Aqua平台上的一个关键仪器&#xff0c;…

npm link 作用

一、npm link 的定义 npm link 是 npm 提供的一个命令&#xff0c;它的主要作用是在本地开发 npm 包时&#xff0c;将本地开发的包链接到全局的 node_modules 目录中&#xff0c;并且在另一个项目中也可以使用这个本地开发的包&#xff0c;就好像它是一个通过 npm install 安装…

Python 数据分析 - Matplotlib 绘图

Python 数据分析 - Matplotlib 绘图 简介绘图折线图单线多线子图 散点图直方图条形图纵置横置多条 饼图 简介 Matplotlib 是 Python 提供的一个绘图库&#xff0c;通过该库我们可以很容易的绘制出折线图、直方图、散点图、饼图等丰富的统计图&#xff0c;安装使用 pip install…

Elasticsearch:如何搜索含有复合词的语言

作者&#xff1a;来自 Elastic Peter Straer 复合词在文本分析和标记过程中给搜索引擎带来挑战&#xff0c;因为它们会掩盖词语成分之间的有意义的联系。连字分解器标记过滤器等工具可以通过解构复合词来帮助解决这些问题。 德语以其长复合词而闻名&#xff1a;Rindfleischetik…

一文读懂fgc之cms

一文读懂 fgc之cms-实战篇 1. 前言 线上应用运行过程中可能会出现内存使用率较高&#xff0c;甚至达到95仍然不触发fgc的情况&#xff0c;存在内存打满风险&#xff0c;持续触发fgc回收&#xff1b;或者内存占用率较低时触发了fgc&#xff0c;导致某些接口tp99&#xff0c;tp…

Python Flask教程

一、前言 Flask是一个用Python编写的轻量级的Web应用框架。 Flask基于WSGI&#xff08;Web Server Gateway Interface&#xff09;和 Jinja2 模板引擎&#xff0c;旨在帮助开发者快速、简便地创建 Web 应用。 Flask 被称为"微框架"&#xff0c;因为它使用简单的核…

ARM嵌入式学习--第十天(UART)

--UART介绍 UART(Universal Asynchonous Receiver and Transmitter)通用异步接收器&#xff0c;是一种通用串行数据总线&#xff0c;用于异步通信。该总线双向通信&#xff0c;可以实现全双工传输和接收。在嵌入式设计中&#xff0c;UART用来与PC进行通信&#xff0c;包括与监控…