React Router v6配置路由守衛

首先準備好以下頁面

登錄頁:用戶可以在此頁面登錄。
受保護頁:只有登錄的用戶可以訪問,否則會重定向到登錄頁。
公共頁面:不需要鑒權,任何人都可以訪問。

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.pswp.cn/web/67341.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/67341.shtml
英文地址,請注明出處:http://en.pswp.cn/web/67341.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

打破傳統束縛:領略 Web3 獨特魅力

在互聯網發展的歷程中&#xff0c;我們見證了Web1和Web2的變遷。Web1是靜態信息的展示平臺&#xff0c;Web2則引領了社交互動和內容創作的繁榮&#xff0c;而如今&#xff0c;Web3作為新時代的互聯網架構&#xff0c;正逐漸展現出其獨特的魅力&#xff0c;帶領我們走向一個更加…

[論文總結] 深度學習在農業領域應用論文筆記14

當下&#xff0c;深度學習在農業領域的研究熱度持續攀升&#xff0c;相關論文發表量呈現出迅猛增長的態勢。但繁榮背后&#xff0c;質量卻不盡人意。相當一部分論文內容空洞無物&#xff0c;缺乏能夠落地轉化的實際價值&#xff0c;“湊數” 的痕跡十分明顯。在農業信息化領域的…

Linux 學習筆記__Day3

十八、設置虛擬機的靜態IP 1、VMware的三種網絡模式 安裝VMware Workstation Pro之后&#xff0c;會在Windows系統中虛擬出兩個虛擬網卡&#xff0c;如下&#xff1a; VMware提供了三種網絡模式&#xff0c;分別是&#xff1a;橋接模式&#xff08;Bridged&#xff09;、NAT…

QT+mysql+python 效果:

# This Python file uses the following encoding: utf-8 import sysfrom PySide6.QtWidgets import QApplication, QWidget,QMessageBox from PySide6.QtGui import QStandardItemModel, QStandardItem # 導入需要的類# Important: # 你需要通過以下指令把 form.ui轉為ui…

筆記本跑大模型嘗試

1&#xff0c;筆記本電腦資源 我是一臺聯想筆記本電腦&#xff0c;基本配置如下&#xff1a; CPU&#xff1a;12th Gen Intel(R) Core(TM) i7-1255U 1.70 GHz (12核心&#xff0c;2個P核和8個E核&#xff0c;共計10個核心) 顯卡&#xff1a;NVIDIA GeForce MX550 內存&am…

C語言實現掃雷游戲(有展開一片和標記雷的功能)

實現準備 分2個.c源文件和1個.h頭文件去寫代碼 test.c 對掃雷游戲進行測試game.c 掃雷游戲功能的實現game.h 掃雷游戲功能的聲明 掃雷游戲 1.test.c對掃雷游戲進行測試 首先我們要先把玩游戲的框架寫出來&#xff0c;然后一步一步去完成其功能 跟著下面的代碼的節奏走一步一步…

GitHub 倉庫的 Archived 功能詳解:中英雙語

GitHub 倉庫的 Archived 功能詳解 一、什么是 GitHub 倉庫的 “Archived” 功能&#xff1f; 在 GitHub 上&#xff0c;“Archived” 是一個專門用于標記倉庫狀態的功能。當倉庫被歸檔后&#xff0c;它變為只讀模式&#xff0c;所有的功能如提交代碼、創建 issue 和 pull req…

基礎IO(2)

基礎IO&#xff08;2&#xff09; 理解“?切皆?件” ?先&#xff0c;在windows中是?件的東西&#xff0c;它們在linux中也是?件&#xff1b;其次?些在windows中不是?件的東西&#xff0c;?如進程、磁盤、顯?器、鍵盤這樣硬件設備也被抽象成了?件&#xff0c;你可以使…

Transformation,Animation and Viewing

4 Transformation&#xff0c;Animation and Viewing 聲明&#xff1a;該代碼來自&#xff1a;Computer Graphics Through OpenGL From Theory to Experiments&#xff0c;僅用作學習參考 4.1 Modeling Transformations 平移、縮放和旋轉&#xff0c;即 OpenGL 的建模轉換&…

Deepseek的RL算法GRPO解讀

在本文中&#xff0c;我們將深入探討Deepseek采用的策略優化方法GRPO&#xff0c;并順帶介紹一些強化學習&#xff08;Reinforcement Learning, RL&#xff09;的基礎知識&#xff0c;包括PPO等關鍵概念。 策略函數&#xff08;policy&#xff09; 在強化學習中&#xff0c; a…

【python】python基于機器學習與數據分析的二手手機特性關聯與分類預測(源碼+數據集)【獨一無二】

&#x1f449;博__主&#x1f448;&#xff1a;米碼收割機 &#x1f449;技__能&#x1f448;&#xff1a;C/Python語言 &#x1f449;專__注&#x1f448;&#xff1a;專注主流機器人、人工智能等相關領域的開發、測試技術。 python基于機器學習與數據分析的二手手機特性關聯與…

手撕Diffusion系列 - 第十一期 - lora微調 - 基于Stable Diffusion(代碼)

手撕Diffusion系列 - 第十一期 - lora微調 - 基于Stable Diffusion&#xff08;代碼&#xff09; 目錄 手撕Diffusion系列 - 第十一期 - lora微調 - 基于Stable Diffusion&#xff08;代碼&#xff09;Stable Diffusion 原理圖Stable Diffusion的原理解釋Stable Diffusion 和Di…

前端【8】HTML+CSS+javascript實戰項目----實現一個簡單的待辦事項列表 (To-Do List)

目錄 一、功能需求 二、 HTML 三、CSS 四、js 1、綁定事件與初始設置 2.、綁定事項 &#xff08;1&#xff09;添加操作&#xff1a; &#xff08;2&#xff09;完成操作 &#xff08;3&#xff09;刪除操作 &#xff08;4&#xff09;修改操作 3、完整js代碼 總結…

C++標準線程庫實現優雅退出的方式

目錄 1.通過設置共享退出標記 2.使用std::jthread創建線程 3.定義消息類型的方式 4.注意事項 1.通過設置共享退出標記 定義一個退出變量bool stop false; 表示線程是否應該停止。在主線程中設置標記stoptrue,然后join一直等待&#xff0c;然后線程循環檢測到stop是否為tru…

Java學習教程,從入門到精通,JDBC插入記錄語法及案例(104)

JDBC插入記錄語法及案例 一、JDBC插入記錄語法 在JDBC中&#xff0c;插入記錄主要通過執行SQL的INSERT語句來實現。其基本語法如下&#xff1a; INSERT INTO 表名 (列1, 列2, ..., 列n) VALUES (值1, 值2, ..., 值n);表名&#xff1a;需要插入記錄的表的名稱。列1, 列2, …,…

vue事件總線(原理、優缺點)

目錄 一、原理二、使用方法三、優缺點優點缺點 四、使用注意事項具體代碼參考&#xff1a; 一、原理 在Vue中&#xff0c;事件總線&#xff08;Event Bus&#xff09;是一種可實現任意組件間通信的通信方式。 要實現這個功能必須滿足兩點要求&#xff1a; &#xff08;1&#…

圖像處理之HSV顏色空間

目錄 1 RGB 的局限性 2 HSV 顏色空間 3 RGB與HSV相互轉換 4 HSV顏色模型對圖像的色相、飽和度和明度進行調節 5 演示Demo 5.1 開發環境 5.2 功能介紹 5.3 下載地址 參考 1 RGB 的局限性 RGB 是我們接觸最多的顏色空間&#xff0c;由三個通道表示一幅圖像&#xff0c;分…

DeepSeek是由杭州深度求索人工智能基礎技術研究有限公司(簡稱“深度求索”)發布的一系列人工智能模型

DeepSeek是由杭州深度求索人工智能基礎技術研究有限公司&#xff08;簡稱“深度求索”&#xff09;發布的一系列人工智能模型&#xff0c;其在知識類任務上展現出了卓越的性能。以下是對DeepSeek的詳細介紹&#xff0c;內容雖無法達到10000字&#xff0c;但會盡可能全面且深入地…

【C++高并發服務器WebServer】-9:多線程開發

本文目錄 一、線程概述1.1 線程和進程的區別1.2 線程之間共享和非共享資源1.3 NPTL 二、線程操作2.1 pthread_create2.2 pthread_exit2.3 pthread_join2.4 pthread_detach2.5 patch_cancel2.6 pthread_attr 三、實戰demo四、線程同步五、死鎖六、讀寫鎖七、生產消費者模型 一、…

14-6-1C++STL的list

(一&#xff09;list容器的基本概念 list容器簡介&#xff1a; 1.list是一個雙向鏈表容器&#xff0c;可高效地進行插入刪除元素 2.list不可以隨機存取元素&#xff0c;所以不支持at.(pos)函數與[ ]操作符 &#xff08;二&#xff09;list容器頭部和尾部的操作 list對象的默…