React Router V5:使用HOC組件實(shí)現(xiàn)路由攔截功能
前言
在Web應(yīng)用程序中,需要對(duì)一些頁(yè)面進(jìn)行訪(fǎng)問(wèn)限制,只允許已經(jīng)登錄的用戶(hù)訪(fǎng)問(wèn)受保護(hù)的頁(yè)面。React Router可以通過(guò)使用高階組件(Higher-order Components,HOC)實(shí)現(xiàn)路由攔截。本文將介紹如何使用React Router實(shí)現(xiàn)路由攔截功能。
一、創(chuàng)建一個(gè)HOC組件
首先,我們需要?jiǎng)?chuàng)建一個(gè)HOC組件,該組件接受一個(gè)組件作為參數(shù),并返回一個(gè)新的組件。例如,我們可以定義一個(gè)名為
AuthWrapper的HOC組件
const AuthWrapper = (Component) => {
// ...
};二、使用withRouter組件
在
AuthWrapper組件中,我們可以使用React Router提供的withRouter高階組件,該組件可以將路由信息添加到組件的props中:
import { withRouter } from 'react-router-dom';
const AuthWrapper = (Component) => {
const WrappedComponent = withRouter((props) => {
// ...
});
return WrappedComponent;
};三、實(shí)現(xiàn)路由攔截
在
AuthWrapper組件中,可以使用componentDidMount生命周期函數(shù)或者useEffect鉤子函數(shù)來(lái)檢查用戶(hù)是否已經(jīng)登錄(或者其它業(yè)務(wù)邏輯)。如果用戶(hù)沒(méi)有登錄,則可以使用history.push()函數(shù)將用戶(hù)重定向到登錄頁(yè)面:
import { useEffect } from 'react';
const AuthWrapper = (Component) => {
const WrappedComponent = withRouter((props) => {
useEffect(() => {
// 檢查用戶(hù)是否已經(jīng)登錄
const user = localStorage.getItem('user');
if (!user) {
// 重定向到登錄頁(yè)面
props.history.push('/login');
}
}, [props.history]);
// 渲染原始組件
return <Component {...props} />;
});
return WrappedComponent;
};在需要訪(fǎng)問(wèn)的受保護(hù)的路由中,可以使用AuthWrapper組件來(lái)包裝路由組件:
<Route path="/dashboard" component={AuthWrapper(Dashboard)} />在上面的代碼中,AuthWrapper將路由組件Dashboard作為參數(shù),并返回一個(gè)新的組件,該組件可以實(shí)現(xiàn)路由攔截。
在應(yīng)用程序中,我們可以使用Route組件來(lái)定義路由,將受保護(hù)的Dashboard組件包裝在AuthWrapper組件中,實(shí)現(xiàn)路由攔截。如果用戶(hù)已經(jīng)登錄,則可以訪(fǎng)問(wèn)受保護(hù)的路由,如果未登錄,則會(huì)被重定向到登錄頁(yè)面
至此,我們已經(jīng)成功地使用React Router實(shí)現(xiàn)了路由攔截功能。
完整示例
import React, { useEffect } from 'react';
import { Route, Redirect, withRouter } from 'react-router-dom';
// 定義一個(gè)HOC組件,用于實(shí)現(xiàn)路由攔截
const AuthWrapper = (Component) => {
// 使用withRouter高階組件,將路由信息作為props傳遞給組件
const WrappedComponent = withRouter((props) => {
useEffect(() => {
// 在組件加載完成后,檢查用戶(hù)是否已經(jīng)登錄
const user = localStorage.getItem('user');
if (!user) {
// 如果用戶(hù)沒(méi)有登錄,則重定向到登錄頁(yè)面
props.history.push('/login');
}
}, [props.history]);
// 如果用戶(hù)已經(jīng)登錄,則渲染原始組件
return localStorage.getItem('user') ? <Component {...props} /> : null;
});
// 返回一個(gè)新的組件,該組件可以進(jìn)行路由攔截
return WrappedComponent;
};
// 受保護(hù)的Dashboard組件,需要進(jìn)行路由攔截
const Dashboard = () => {
return <h1>Dashboard</h1>;
};
// 定義路由
const App = () => {
return (
<div>
<Route path="/dashboard" component={AuthWrapper(Dashboard)} />
<Route path="/login" component={Login} />
</div>
);
};
// 登錄組件
const Login = () => {
const handleLogin = () => {
// 模擬登錄成功,將用戶(hù)信息保存到localStorage中
localStorage.setItem('user', 'foo');
};
return (
<div>
<h1>Login</h1>
<button onClick={handleLogin}>Login</button>
</div>
);
};
到此這篇關(guān)于React Router V5:使用HOC組件實(shí)現(xiàn)路由攔截的文章就介紹到這了,更多相關(guān)React Router 路由攔截內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解react-native WebView 返回處理(非回調(diào)方法可解決)
這篇文章主要介紹了詳解react-native WebView 返回處理(非回調(diào)方法可解決),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02
React實(shí)現(xiàn)動(dòng)態(tài)調(diào)用的彈框組件
這篇文章主要為大家詳細(xì)介紹了React實(shí)現(xiàn)動(dòng)態(tài)調(diào)用的彈框組件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
在react-antd中彈出層form內(nèi)容傳遞給父組件的操作
這篇文章主要介紹了在react-antd中彈出層form內(nèi)容傳遞給父組件的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10
react-native ListView下拉刷新上拉加載實(shí)現(xiàn)代碼
本篇文章主要介紹了react-native ListView下拉刷新上拉加載實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
Ant?Design?組件庫(kù)之步驟條實(shí)現(xiàn)
這篇文章主要為大家介紹了Ant?Design組件庫(kù)之步驟條實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
關(guān)于react ant 組件 Select下拉框 值回顯的問(wèn)題
這篇文章主要介紹了關(guān)于react ant 組件 Select下拉框 值回顯的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08

