React封裝高階組件實(shí)現(xiàn)路由權(quán)限的控制詳解
React高階組件是什么
官方解釋∶
高階組件(HOC)是 React 中用于復(fù)用組件邏輯的一種高級(jí)技巧。HOC 自身不是 React API 的一部分,它是一種基于 React 的組合特性而形成的設(shè)計(jì)模式。
高階組件(HOC)就是一個(gè)函數(shù),且該函數(shù)接受一個(gè)組件作為參數(shù),并返回一個(gè)新的組件,它只是一種組件的設(shè)計(jì)模式,這種設(shè)計(jì)模式是由react自身的組合性質(zhì)必然產(chǎn)生的。我們將它們稱為純組件,因?yàn)樗鼈兛梢越邮苋魏蝿?dòng)態(tài)提供的子組件,但它們不會(huì)修改或復(fù)制其輸入組件中的任何行為。
HOC的優(yōu)缺點(diǎn)
- 優(yōu)點(diǎn)∶ 邏輯復(fù)用、不影響被包裹組件的內(nèi)部邏輯。
- 缺點(diǎn)∶hoc傳遞給被包裹組件的props容易和被包裹后的組件重名,進(jìn)而被覆蓋
路由權(quán)限控制做什么
主要就是判斷用戶是否登陸,只有登陸獲取到有效的token,才能跳轉(zhuǎn)到頁面。
思路:
判斷是否有 token ,如果有 token 則返回正常的組件,如果沒有 token 則跳轉(zhuǎn)到登陸頁。
實(shí)現(xiàn):
因?yàn)槭莟s所以先定義參數(shù)類型,這里的ReactElement
代表的是一個(gè) React 元素例如:<div/> 或者是組件。之后我們獲取到 token ,通過 token 的有無判斷跳轉(zhuǎn)到相應(yīng)頁面。
代碼
封裝高階組件:
interface AuthRouteProps { children: React.ReactElement; } export function AuthRoute({ children }: AuthRouteProps) { const token = getToken(); if (token) { return <>{children}</>; } else { // 使用 Navigate 組件進(jìn)行導(dǎo)航 message.error("請(qǐng)先登錄"); return <Navigate to="/login" />; } }
在路由配置文件中,引入封裝的組件,例如:
children: [ { index: true, element: <Chat /> }, { path: '/paint', element: ( <AuthRoute><Paint /></AuthRoute> ) }, { path: '/me', element: <div>我的</div> } ]
缺點(diǎn)
目前只是通過判斷 token 有無,如果 token 失效了卻還是會(huì)跳轉(zhuǎn),如果是跳轉(zhuǎn)到的頁面需要攜帶token 則可以在響應(yīng)攔截器中進(jìn)行處理:token 會(huì)發(fā)給后端,后端通過解密后來判斷用戶是否存在
// 添加響應(yīng)攔截器 request.interceptors.response.use( function (response) { // 2xx 范圍內(nèi)的狀態(tài)碼都會(huì)觸發(fā)該函數(shù)。 // 對(duì)響應(yīng)數(shù)據(jù)做點(diǎn)什么 return response.data; }, function (error) { // 超出 2xx 范圍的狀態(tài)碼都會(huì)觸發(fā)該函數(shù)。 // 對(duì)響應(yīng)錯(cuò)誤做點(diǎn)什么 if(error.status === 401){ removeToken() router.navigate('/login') window.location.reload() } return Promise.reject(error); } );
如果只是單純的跳轉(zhuǎn)頁面的話要進(jìn)行改造也是發(fā)一個(gè)請(qǐng)求給后端,后端通過處理返回給前端 token 是否有效:
export async function AuthRoute({children}){ const token = getToken(); // 模擬請(qǐng)求發(fā)給后端token const res = await getUserInfo({ token }); if (res.data.code) { return <>{children}</>; } else { return <Navigate to="/login" replace />; } }
所以要通過具體的業(yè)務(wù)來處理用戶登陸和 token 是否有效。
比較
通過這樣的方式寫和直接在訪問頁面中判斷token有什么區(qū)別?
直接在訪問頁面時(shí)判斷:這種方式通常是在頁面組件加載或渲染時(shí)進(jìn)行的,即在用戶已經(jīng)導(dǎo)航到該頁面后才進(jìn)行檢查。
使用AuthRoute
組件:判斷是在路由跳轉(zhuǎn)之前進(jìn)行的。當(dāng)用戶嘗試訪問受保護(hù)的路由時(shí),AuthRoute
組件會(huì)首先檢查token,然后決定是否允許訪問或進(jìn)行重定向。
以上就是React封裝高階組件實(shí)現(xiàn)路由權(quán)限的控制詳解的詳細(xì)內(nèi)容,更多關(guān)于React路由權(quán)限控制的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
React?跨端動(dòng)態(tài)化核心技術(shù)實(shí)例分析
這篇文章主要為大家介紹了React?跨端動(dòng)態(tài)化核心技術(shù)實(shí)例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10React項(xiàng)目動(dòng)態(tài)修改主題顏色的方案
這篇文章主要介紹了React項(xiàng)目動(dòng)態(tài)修改主題顏色的方案,文中通過代碼示例講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2025-01-01React?Hooks中?useRef和useImperativeHandle的使用方式
這篇文章主要介紹了React?Hooks中?useRef和useImperativeHandle的使用方式,文中說明了useRef和useCallback一起使用,?可以解決閉包陷阱的問題,本文結(jié)合實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10React?Native?中處理?Android?手機(jī)吞字的解決方案
這篇文章主要介紹了React?Native?中處理?Android?手機(jī)吞字的解決方案,作者在 React Native 0.67.4 環(huán)境下,編寫了一個(gè)小 demo 來復(fù)現(xiàn)這個(gè)問題,需要的朋友可以參考下2022-08-08