#javascript #reactjs #react-router #router
#javascript #reactjs #реагировать-маршрутизатор #маршрутизатор
Вопрос:
Я использую функциональный компонент, который обеспечивает аутентификацию для определенных маршрутов, таких как / dashboard, используя аутентификацию на стороне сервера, происходящую в useeffect функции моего приложения.
Аутентификация работает нормально, а также, когда я нажимаю кнопку панели мониторинга, я попадаю на панель мониторинга, когда я вхожу в систему, иначе перенаправляется на домашнюю страницу.
Проблема возникает, когда я перезагружаю страницу / dashboard . В это время я наблюдаю, что все повторно отображается, и перед тем, как пройти use effect, оно сначала переходит из AuthenticatedRoute, который не дает аутентификации, потому что в use effect происходит аутентификация на стороне сервера, и я напрямую перенаправляюсь на домашнюю страницу, даже когда я вошел в систему.
App.js
const AuthenticatedRoute = ({ children, isAuthenticated , ...rest }) => {
return (
<Route
{...rest}
render={() =>
isAuthenticated ? (
<div>{children}</div>
) : (
<Redirect to="/home" />)}
></Route>
);
};
Код маршрута:
App.js
<AuthenticatedRoute isAuthenticated = {isAuthenticated} path="/dashboard">
<AgentDashboard />
</AuthenticatedRoute>
App.js
function App() {
const [authTokenValid, setauthTokenValid] = useState(false)
useEffect(() => {
const token = localStorage.getItem('Authorization')
const authMainPageCheck = async () => {
await axios.post(tokenAuthCheckURL , {
'token':token,
}).then(result => result.data).then(
result => {
if(result.status === 200){
console.log("Authentication Given ")
setauthTokenValid(true)
}
else{
console.log("Authentication Not Given ")
setauthTokenValid(false)
}
})
}
authMainPageCheck()
}, [])
Ответ №1:
Пожалуйста, попробуйте этот код ниже:
import React, { useEffect, useState } from "react";
import { Route, Redirect, BrowserRouter } from "react-router-dom";
// import axios from "axios";
// @ts-ignore
const AuthenticatedRoute = ({ children, isAuthenticated, ...rest }) => {
return (
<Route
{...rest}
render={() =>
isAuthenticated ? (
<div>
{children}
</div>
) : (<Redirect to="/error" />)
}
></Route>
);
};
export const App = () => {
// Set initial value to null
const [authTokenValid, setauthTokenValid] = useState(null)
useEffect(() => {
// Wait for request to complete
// Example...
setTimeout(() => {
// @ts-ignore
setauthTokenValid(true);
}, 3000);
// const token = localStorage.getItem('Authorization');
// const authMainPageCheck = async () => {
// await axios.post(tokenAuthCheckURL, {
// token,
// }).then(result => result.data).then(
// result => {
// if (result.status === 200) {
// console.log("Authentication Given ")
// setauthTokenValid(true)
// } else {
// console.log("Authentication Not Given ")
// setauthTokenValid(false)
// }
// }
// )
// }
}, []);
if (authTokenValid === null)
// Wait Until a Non Null Response Comes....
return (<h1>Loading...</h1>); // Create a new loading component...
else
return (
<BrowserRouter>
<AuthenticatedRoute isAuthenticated={authTokenValid} exact path="/">
<h1>This is Authenticated Home!!!</h1>
</AuthenticatedRoute>
<AuthenticatedRoute isAuthenticated={authTokenValid} exact path="/dashboard">
<h1>This is Authenticated Dashboard!!!</h1>
</AuthenticatedRoute>
</BrowserRouter>
);
}
Комментарии:
1. Привет, Саиф, это была опечатка, это уже вне useeffect , спасибо, что указали, что я отредактировал свой вопрос.
2. Итак, насколько я понимаю, похоже, что вы пытаетесь автоматически аутентифицировать пользователей, и в случае успеха затем перенаправляет другой компонент успеха. дайте мне знать, если я прав… Я опубликую другое решение…
3. да, вы правы, и эта часть работает нормально, но единственная проблема заключается в том, что после того, как вы отрисовали компонент успеха, при перезагрузке он должен быть в том же компоненте.