Я использую реагирование с хуками и контекстным API для передачи моего состояния в качестве реквизита другим компонентам. Я создал маршрутизацию на основе зарегистрированных пользователей и посетителей. Я столкнулся с одной проблемой здесь. Когда пользователь выходит из системы, он должен перенаправить на страницу входа. URL-адрес изменяется, но компонент входа не отображается. в то время как после входа я могу перенаправить на страницу своей учетной записи.
INDEX. JS FILE (здесь добавлен только необходимый фрагмент)
import AuthContextProvider from './context/auth-context';
ReactDOM.render(
<AuthContextProvider>
<App />
</AuthContextProvider>,
document.getElementById('root'));
ЗДЕСЬ МОЕ ПРИЛОЖЕНИЕ. JS
import React, { useContext } from 'react';
import { BrowserRouter, Route, Switch } from 'react-router-dom';
import 'bootstrap/dist/css/bootstrap.min.css';
import { Container } from 'reactstrap';
import Navbar from './components/shared/Navbar/Navbar';
import Home from './components/Home/Home';
import Login from './components/Auth/Login/Login';
import Signup from './components/Auth/Signup/Signup';
import Footer from './components/shared/Footer/Footer'
import { AuthContext } from './context/auth-context';
import MyAccount from "./components/User/MyAccount";
import Logout from "./components/Auth/Logout/Logout";
import Error from "./components/Error";
const App = (props) => {
const authContext = useContext(AuthContext);
let routes;
console.log(authContext.isAuth, 'in app');
if (authContext.isAuth) {
routes = (
<>
<Route path="/my-account" component={MyAccount} />
<Route path="/logout" component={Logout} />
</>
);
} else {
routes = (
<>
<Route path="/login" component={Login} />
<Route path="/signup" component={Signup} />
</>
);
}
return (
<BrowserRouter>
<Container>
<Navbar />
<Switch>
<Route path="/" exact component={Home} />
{routes}
<Route component={Error} />
</Switch>
<Footer />
</Container>
</BrowserRouter>
);
}
export default App;
ЗДЕСЬ МОЙ АВТО-КОНТЕКСТ. JS
import React, { useState } from 'react';
export const AuthContext = React.createContext({
isAuth: false,
login: () => {}
});
const AuthContextProvider = props => {
const [isAuthenticated, setIsAuthenticated] = useState(false);
if(localStorage.getItem('token') != null && !isAuthenticated){
setIsAuthenticated(true);
}
const loginHandler = () => {
setIsAuthenticated(true);
};
//console.log(isAuthenticated,'ssss')
return (
<AuthContext.Provider
value={{ login: loginHandler, isAuth: isAuthenticated }}
>
{props.children}
</AuthContext.Provider>
);
};
export default AuthContextProvider;
ЗДЕСЬ ВЫХОД. JS
import React, { useState ,useEffect, useContext } from "react";
import { AuthContext } from '../../../context/auth-context';
import { Redirect, withRouter } from 'react-router-dom';
const Logout = (props) => {
const authContext = useContext(AuthContext);
let [isLogout, setIsLogout] = useState(false);
localStorage.removeItem('token');
localStorage.removeItem('expiryDate');
localStorage.removeItem('userId');
useEffect(() =>{
setIsLogout((preIsLogout) => {
isLogout = !preIsLogout;
});
authContext.isAuth = false;
console.log('logout', isLogout)
//props.history.push('/login');
},[])
return (
<React.Fragment>
{ isLogout ? <Redirect to="/login" /> : null}
<div>
<p>Logout</p>
</div>
</React.Fragment>
)
}
export default withRouter(Logout);