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)到頁(yè)面。
思路:
判斷是否有 token ,如果有 token 則返回正常的組件,如果沒(méi)有 token 則跳轉(zhuǎn)到登陸頁(yè)。
實(shí)現(xiàn):
因?yàn)槭莟s所以先定義參數(shù)類型,這里的ReactElement代表的是一個(gè) React 元素例如:<div/> 或者是組件。之后我們獲取到 token ,通過(guò) token 的有無(wú)判斷跳轉(zhuǎn)到相應(yīng)頁(yè)面。
代碼
封裝高階組件:
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)
目前只是通過(guò)判斷 token 有無(wú),如果 token 失效了卻還是會(huì)跳轉(zhuǎn),如果是跳轉(zhuǎn)到的頁(yè)面需要攜帶token 則可以在響應(yīng)攔截器中進(jìn)行處理:token 會(huì)發(fā)給后端,后端通過(guò)解密后來(lái)判斷用戶是否存在
// 添加響應(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)頁(yè)面的話要進(jìn)行改造也是發(fā)一個(gè)請(qǐng)求給后端,后端通過(guò)處理返回給前端 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 />;
}
}所以要通過(guò)具體的業(yè)務(wù)來(lái)處理用戶登陸和 token 是否有效。
比較
通過(guò)這樣的方式寫(xiě)和直接在訪問(wèn)頁(yè)面中判斷token有什么區(qū)別?
直接在訪問(wèn)頁(yè)面時(shí)判斷:這種方式通常是在頁(yè)面組件加載或渲染時(shí)進(jìn)行的,即在用戶已經(jīng)導(dǎo)航到該頁(yè)面后才進(jìn)行檢查。
使用AuthRoute組件:判斷是在路由跳轉(zhuǎn)之前進(jìn)行的。當(dāng)用戶嘗試訪問(wèn)受保護(hù)的路由時(shí),AuthRoute組件會(huì)首先檢查token,然后決定是否允許訪問(wèn)或進(jìn)行重定向。
以上就是React封裝高階組件實(shí)現(xiàn)路由權(quán)限的控制詳解的詳細(xì)內(nèi)容,更多關(guān)于React路由權(quán)限控制的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
初識(shí)React及React開(kāi)發(fā)依賴詳解
React由Facebook來(lái)更新和維護(hù),它是大量?jī)?yōu)秀程序員的思想結(jié)晶,React的流行不僅僅局限于普通開(kāi)發(fā)工程師對(duì)它的認(rèn)可,大量流行的其他框架借鑒React的思想,接下來(lái)通過(guò)本文介紹React基礎(chǔ)及React開(kāi)發(fā)依賴介紹,需要的朋友可以參考下2022-10-10
react中使用js實(shí)現(xiàn)頁(yè)面滾動(dòng)監(jiān)聽(tīng)(推薦)
這篇文章主要介紹了react中使用js實(shí)現(xiàn)頁(yè)面滾動(dòng)監(jiān)聽(tīng),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-04-04
React+hook實(shí)現(xiàn)聯(lián)動(dòng)模糊搜索
這篇文章主要為大家詳細(xì)介紹了如何利用React+hook+antd實(shí)現(xiàn)聯(lián)動(dòng)模糊搜索功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02
React如何實(shí)現(xiàn)Vue的watch監(jiān)聽(tīng)屬性
在 Vue 中可以簡(jiǎn)單地使用 watch 來(lái)監(jiān)聽(tīng)數(shù)據(jù)的變化,還能獲取到改變前的舊值,而在 React 中是沒(méi)有 watch 的,今天通過(guò)本文給大家講解React實(shí)現(xiàn)Vue的watch監(jiān)聽(tīng)屬性的方法,需要的朋友可以參考下2023-06-06
React Native模塊之Permissions權(quán)限申請(qǐng)的實(shí)例相機(jī)
這篇文章主要介紹了React Native模塊之Permissions權(quán)限申請(qǐng)的實(shí)例相機(jī)的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下2017-09-09
淺談webpack+react多頁(yè)面開(kāi)發(fā)終極架構(gòu)
這篇文章主要介紹了淺談webpack+react多頁(yè)面開(kāi)發(fā)終極架構(gòu),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11

