问题描述
我试图找出发生了什么,但没有成功。我在互联网上搜索了许多主题,但一无所获,绝对没有任何帮助。
我一直在用 ReactJS 开发一个项目,在那里我有一个登录页面(使用 Context API),当我向后端提交登录表单时,如果身份验证成功,它会在标头中返回一个 JWT 令牌,然后,组件应该重定向到“/home”页面。
我知道 history v.5 无法与 ReactJS 一起正常工作的问题,但我已经将版本更改为 ^4.10.1,但问题仍然存在。
这里有一些代码:
HistoryDefaults.js
import { createBrowserHistory } from 'history';
export default createBrowserHistory();
登录/Hooks.js
import { useEffect,useState } from 'react';
import api from '../../defaults/AxiosDefaults';
import history from '../../defaults/HistoryDefaults';
import { login } from '../../services/AxiosService';
export default function LoginHooks(){
const [username,setUsername] = useState('');
const [password,setPassword] = useState('');
const [authenticated,setAuthenticated] = useState(false);
const [loading,setLoading] = useState(true);
const [invalidClass,setInvalidClass] = useState('');
useEffect(() => {
const token = localStorage.getItem('Token');
if (token) {
api.defaults.headers.Authorization = JSON.parse(token);
setAuthenticated(true);
}
setLoading(false);
},[]);
async function handleLogin(e) {
e.preventDefault();
await login({ username,password })
.then(result => {
const token = result.headers.authorization;
localStorage.setItem('Token',JSON.stringify(token));
api.defaults.headers.Authorization = token;
setAuthenticated(true);
history.push('/home');
}).catch(err => {
setInvalidClass('is-invalid');
})
}
function handleLogout() {
setAuthenticated(false);
localStorage.removeItem('Token');
api.defaults.headers.Authorization = undefined;
setUsername('');
setPassword('');
history.push('/');
}
function handleUsernameChange(e) {
const username = e.target.value;
setUsername(username);
}
function handlePasswordChange(e) {
const password = e.target.value;
setPassword(password);
}
return {
username,password,authenticated,loading,invalidClass,handleLogin,handleLogout,handlePasswordChange,handleUsernameChange
}
}
登录/Login.js
import React from 'react';
import LoginHooks from './Hooks';
import Header from '../commons/Header';
export default function Login() {
const {username,handleUsernameChange,handlePasswordChange} = LoginHooks();
return (
<div className="container min-vh-100">
<div className="d-flex min-vh-100 justify-content-center align-items-center">
<div className="p-3 border w-50 rounded-lg">
<Header />
<hr />
{
invalidClass ? <div className="alert alert-danger text-center" role="alert">Bad Credentials</div> : <div></div>
}
<form onSubmit={handleLogin}>
<div className="form-group">
<label htmlFor="username">Username</label>
<input
type="text"
className={invalidClass + " form-control"}
name="username"
onChange={handleUsernameChange}
value={username}
/>
</div>
<div className="form-group">
<label htmlFor="password">Password</label>
<input
type="password"
className={invalidClass + " form-control"}
name="password"
onChange={handlePasswordChange}
value={password}
/>
</div>
<div className="form-group form-check">
</div>
<div className="from-group">
<button type="submit" className="btn btn-info form-control">Login</button>
</div>
</form>
</div>
</div>
</div>
)
}
contexts/AuthContext.js
import React,{ createContext } from 'react';
import LoginHooks from '../components/login/Hooks';
const Context = createContext();
function AuthProvider({ children }) {
const { loading,handleLogout } = LoginHooks();
return (
<Context.Provider value={{ loading,handleLogout }}>
{children}
</Context.Provider>
);
}
export { Context,AuthProvider };
路由/CustomRoute.js
import React,{ useContext } from 'react';
import Home from '../home/Home';
import Login from '../login/Login';
import { Context } from '../../contexts/AuthContext';
import { Redirect,Route,Switch } from 'react-router-dom';
function CustomRoute({ isPrivate,...rest }) {
const { loading,authenticated } = useContext(Context);
if(loading){
return <h1>Loading...</h1>
}
if(isPrivate && !authenticated) {
return <Redirect to="/" />
}
return <Route {...rest} />
}
export default function Routes() {
return (
<Switch>
<CustomRoute exact path="/" component={Login} />
<CustomRoute isPrivate exact path="/home" component={Home} />
</Switch>
)
}
App.js
import './App.css';
import React from 'react';
import { Router } from 'react-router-dom';
import Routes from './components/route/CustomRoute';
import history from './defaults/HistoryDefaults';
import { AuthProvider } from './contexts/AuthContext';
export default function App() {
return (
<AuthProvider>
<Router history={history}>
<Routes />
</Router>
</AuthProvider>
);
}
更新 一个额外的信息是,这个问题只有在我点击退出系统时才会发生。我的意思是,第一次登录会按预期重定向我,但是一旦登录,当我单击注销并再次尝试登录时,历史记录不会重定向我。
有人知道这是怎么回事吗,请解释一下我的错误是什么?
谢谢大家
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)