react項目使用EventBus實現登錄攔截

關于EventBus

EventBus是一個事件發布/訂閱模式的實現,它允許不同的組件或模塊之間進行通信,而不需要直接引用對方。這種模式特別適用于那些需要跨組件傳遞信息,但又不想引入復雜依賴關系的場景。

實現思路

  1. 利用axios中間件,在axios中攔截401的code狀態碼,攔截到之后,發起events事件
  2. 在app.tsx中監聽,然后跳轉頁面

為什么不使用window.localtion = xxxx跳轉?這樣破壞單頁面應用的交互,使用window.location 頁面會直接刷新。
為什么不直接使用navigate跳轉? navigate只能在組件中使用。

實現步驟

實現EventBus

新建一個event.js文件

import { EventEmitter } from 'events';
const eventBus = new EventEmitter()export default eventBus;

在axios中進行攔截時使用

import axios from 'axios';
import EventBus from './event'
const instance = axios.create({
})
instance.interceptors.response.use(function (response) {if (response.status === 200) {if (response.data.code === 401) {// 此時用戶沒有進行登錄EventBus.emit('global_not_login', response.data.msg)}if (response.data.code === -1) {EventBus.emit('global_error_tips', response.data.msg)}} else if (response.status === 403) {EventBus.emit('global_error_auth', '沒有權限,別瞎訪問')}return response;
}, function (error) {EventBus.emit('global_error_tips', error.response.data.message)return Promise.reject(error);
});
export type AxiosRes<T = ResData> = {config: Object,data: T,headers: any,request: any,status: number,statusText: string
}
export type ResData<T = any> = {code: number,msg: string,data: T
}
export type AxiosResData<T = any> = AxiosRes<ResData<T>>
export default instance

在app.ts頁面進行監聽

部分代碼如下,核心就是在useEffect使用EventBus.on訂閱global_not_login這個事件,檢測到事件的發出,則跳轉到登錄頁面

function App() {const navigate = useNavigate()useEffect(()=>{EventBus.on('global_not_login', function (msg) {navigate('/login')})}, [])return (<Routes><Route path="/" element={<Navigate to={'/login'}></Navigate>}></Route>{/* 頁面1  登錄 */}<Route path={routersData.login.path} element={<Login />}></Route></Routes>)
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/46119.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/46119.shtml
英文地址,請注明出處:http://en.pswp.cn/web/46119.shtml

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

相關文章

防火墻之帶寬管理篇

核心思想 1.帶寬限制&#xff1a;限制非關鍵業務流量占用帶寬的比例 2.帶寬保證&#xff1a;保證關鍵的業務流量傳輸不受影響。業務繁忙時&#xff0c;確保業務不受影響。 3.限制連接數&#xff1a;可以針對某些業務進行連接數的限制&#xff0c;首先可以降低該業務占用帶寬…

基于UltraFace的人臉檢測在地平線旭日X3派上的部署和測試(Python版本和C++版本)

電腦端的測試環境搭建 如果不想再搭建環境和測試代碼bug上浪費更多的時間可以直接獲取本人的測試虛擬機&#xff0c;所有的測試代碼、虛擬環境和板端測試工程以全部打包到了虛擬機&#xff0c;需要的可以通過網盤獲取&#xff1a; 代碼和虛擬機百度網盤鏈接&#xff1a; 鏈接…

【AI繪畫教程】Stable Diffusion 1.5 vs 2

在本文中,我們將總結穩定擴散 1 與穩定擴散 2 辯論中的所有要點。我們將在第一部分中查看這些差異存在的實際原因,但如果您想直接了解實際差異,您可以跳下否定提示部分。讓我們開始吧! Stable Diffusion 2.1 發布與1.5相比,2.1旨在解決2.0的許多相對缺點。本文的內容與理解…

網絡和安全操作

一、編輯文件 文本編輯器有很多&#xff0c;比如圖形模式的gedit、OpenOffice 等&#xff0c;文本模式下的編輯器有vi、vim&#xff08;vi的增強版本&#xff09;等。vi和vim是我們在Linux中最常用的編輯器。 gedit&#xff1a;類似于windows下的記事本&#xff0c;很方便的去…

IO多路復用技術、select、poll、epoll聯系與區別

目錄 IO多路復用技術select&#xff1a;poll&#xff1a;epoll&#xff08;Linux特有&#xff09;&#xff1a; epoll select poll的區別epoll是同步還是異步epoll詳解 IO多路復用技術 通信雙方都有一個socket&#xff0c;以一個文件描述符的形式存在&#xff0c;那這個fd也對…

AI 大事件:超級明星 Andrej Karpathy 創立AI教育公司 Eureka Labs

&#x1f9e0; AI 大事件&#xff1a;超級明星 Andrej Karpathy 創立AI教育公司 Eureka Labs 摘要 Andrej Karpathy 作為前 OpenAI 聯合創始人、Tesla AI 團隊負責人&#xff0c;他的專業性和實力備受矚目。Karpathy 對 AI 的普及和教育充滿熱情&#xff0c;從 YouTube 教程到…

CBSD bhyve Ubuntu 配置vnc登錄管理

CBSD介紹 CBSD是為FreeBSD jail子系統、bhyve、QEMU/NVMM和Xen編寫的管理層。該項目定位為一個綜合解決方案的單一集成工具&#xff0c;用于使用預定義的軟件集以最少的配置快速構建和部署計算機虛擬環境。 雖然CBSD沒有提供額外的操作系統級功能&#xff0c;但它極大地簡化了…

兩年經驗前端帶你重學前端框架必會的ajax+node.js+webpack+git等技術 Day1

黑馬程序員前端AJAX入門到實戰全套教程&#xff0c;包含學前端框架必會的&#xff08;ajaxnode.jswebpackgit&#xff09;&#xff0c;一套全覆蓋 Day1 你好,我是Qiuner. 為幫助別人少走彎路和記錄自己編程學習過程而寫博客 這是我的 github https://github.com/Qiuner ?? ?…

【算法/天梯賽訓練】天梯賽模擬題集

L1-009 N個數求和 #include <iostream> #include <algorithm>using namespace std;typedef long long ll; const int N 105;typedef struct node {ll x, y; }node; node a[N];ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a; }int main() {int n;cin >>…

《昇思25天學習打卡營第25天|第9天》

今天是打卡的第九天&#xff0c;今天學習的是使用靜態圖加速這門課程&#xff0c;從他的背景學起&#xff1a;AI編譯框架分為兩種運行模式&#xff0c;分別是動態圖模式和靜態圖模式&#xff0c;動態圖模式特點&#xff1a;計算圖的構建和計算同時發生&#xff0c;缺點&#xf…

Qt Style Sheets-樣式表語法

樣式表語法 Qt 樣式表術語和語法規則幾乎與 HTML CSS 的相同。如果您已經了解 CSS&#xff0c;您可能可以快速瀏覽此部分。 樣式規則 樣式表由一系列樣式規則組成。樣式規則由選擇器和聲明組成。選擇器指定哪些小部件受該規則影響&#xff1b;聲明指定應在小部件上設置哪些屬性…

ThinkPHP6事件系統使用指南

本文由 ChatMoney團隊出品 在ThinkPHP 6中&#xff0c;事件系統提供了一種優雅的方式來實現解耦和動態響應。你可以通過注冊事件和對應的監聽者來處理各種應用邏輯。 事件注冊 閉包注冊 閉包是最簡單的事件監聽者&#xff0c;可以直接在注冊時定義。 Event::listen("C…

Linux操作系統之多文件管理

makefile: makefile文件用于管理和組織代碼工程的編譯和鏈接,被make工具解析并完成相關動作 make: 工程管理工具 語法: 要生成的文件:依賴的所有文件 時間戳: 編譯文件時,時間戳更新的文件需要重新加入編譯,時間戳沒有改變的不需要重新編譯 app:main.c add.c sub.c …

如何追查一個packet在linux 系統哪里丟失

要想追一個包在系統哪里丟失了&#xff0c; 就要了解 一個應用層的包在送出時 要經歷那些 檢查點 和被丟掉的點。 1. 在傳輸層&#xff0c;如果是 tcp 包 會有contrack 的 buf 的限制 可能會導致 packets 的丟失。 > 檢查辦法&#xff1a;查看dmesg日志有報錯&#xff1a;k…

MySQL數據庫慢查詢日志、SQL分析、數據庫診斷

1 數據庫調優維度 業務需求&#xff1a;勇敢地對不合理的需求說不系統架構&#xff1a;做架構設計的時候&#xff0c;應充分考慮業務的實際情況&#xff0c;考慮好數據庫的各種選擇(讀寫分離?高可用?實例個數?分庫分表?用什么數據庫?)SQL及索引&#xff1a;根據需求編寫良…

C# 實體更新記錄:如何捕獲和記錄字段變化到日志

方案一&#xff1a;粗糙但可用 var changes new List<string>();void CompareAndAddChange<T>(string propertyName, T oldValue, T newValue, Func<T, string> descriptionFunc null) {if (!EqualityComparer<T>.Default.Equals(oldValue, newVa…

分支定界法(Branch and Bound, 簡稱BB)是一種求解整數規劃問題的有效算法。

分支定界法&#xff08;Branch and Bound&#xff09;詳解與Python代碼示例 分支定界法概述 分支定界法&#xff08;Branch and Bound, 簡稱B&B&#xff09;是一種求解整數規劃問題的有效算法。它結合了搜索與迭代的思想&#xff0c;通過系統地枚舉候選解來尋找最優解。在…

Java Web常見框架尋找路由技巧

在Java Web代碼審計中&#xff0c;尋找和識別路由是很關鍵的部分。通過注冊的路由可以找到當前應用對應的Controller&#xff0c;其作為MVC架構中的一個組件&#xff0c;可以說是每個用戶交互的入口點。簡單介紹下Java Web中常見框架&#xff08;Spring Web、Jersey&#xff09…

【SASS/SCSS(二)】模塊化語法

目錄 一、use 1、命名空間 2、私有變量 3、用with改變模塊中的默認值 二、forward 1、給forward模塊起別名&#xff0c;讓成員加前綴 2、利用hide or show手動控制成員的可訪問性 三、import 1、不存在命名空間&#xff0c;成員變量在import之后直接公開 2、可以在嵌…

springboot防止重復提交的方案有哪些

在Spring Boot中&#xff0c;防止接口或表單重復提交有多種策略&#xff0c;以下是幾種常見且有效的方案&#xff1a; 前端控制&#xff1a; 禁用提交按鈕&#xff1a;在表單提交后&#xff0c;使用JavaScript立即禁用提交按鈕&#xff0c;防止用戶再次點擊。響應式提示&#x…