【发布时间】:2022-01-03 17:05:40
【问题描述】:
在我的 React 应用程序中,当用户成功签名后,他/她的信息将保存在本地存储中。只有当用户成功登录时,才会将令牌保存在会话存储中。
现在我知道只有当用户成功登录时,令牌才会在会话存储中。基于这个令牌,我想设置我的私有路由。
我尝试过类似的事情,如果令牌为空,那么它应该保留在登录表单上,如果令牌不为空,则转到主页但是这样做并没有设置我的路由。
我想也许我在运行路由器、路由和路由的 App.js 文件中犯了一些错误,或者我正在检查令牌是否为空,我在那里犯了一些错误。
请帮助我纠正我的错误。谢谢。
这是我的代码。
Login.js
import React, { useState } from "react";
import { Form, Button } from "react-bootstrap";
import { Link } from "react-router-dom";
const Login = ({ setTokenData }) => {
const initialValues = {
email: "",
password: "",
};
const [userData, setUserData] = useState(initialValues);
const authenticateUser = () => {
const localInfo = JSON.parse(localStorage.getItem("signUpUser"));
localInfo?.map((item) => {
const userName = item.email;
const userPassword = item.password;
if (userName === userData.email && userPassword === userData.password) {
console.log("success");
const token = Math.random().toString(36).substr(2, 5);
console.log("token is:", token);
sessionStorage.setItem("token", JSON.stringify(token));
setTokenData(token);
} else {
console.log("failure");
return false;
}
});
setUserData(initialValues);
};
return (
<>
<Form className="loginForm">
<Form.Group className="mb-3" controlId="formBasicEmail">
<Form.Label>Email Address</Form.Label>
<Form.Control
type="email"
placeholder="Enter email"
value={userData.email}
name="email"
onChange={(e) =>
setUserData({ ...userData, [e.target.name]: e.target.value })
}
/>
</Form.Group>
<Form.Group className="mb-3" controlId="formBasicPassword">
<Form.Label>Password</Form.Label>
<Form.Control
type="password"
placeholder="Password"
name="password"
value={userData.password}
onChange={(e) =>
setUserData({ ...userData, [e.target.name]: e.target.value })
}
/>
</Form.Group>
<Form.Group className="mb-3" controlId="formBasicCheckbox"></Form.Group>
<Button
variant="primary"
type="submit"
onClick={() => authenticateUser()}
>
Login
</Button>
<div className="txtToSignUpBtn">
<span>OR</span> <Link to="/signUp">Click here to Register</Link>
</div>
</Form>
</>
);
};
export default Login;
PrivateRoute.js
import React from 'react'
import { Navigate } from 'react-router-dom';
import Login from "./Login";
import Header from "./Header";
const getTokenData = () => {
const token = JSON.parse(sessionStorage.getItem("token"));
if (token) {
return JSON.parse(sessionStorage.getItem("token"));
} else {
return null;
}
};
const RequireAuth = () => {
const [tokenData, setTokenData] = useState(getTokenData());
if (tokenData === null) {
return <Login setTokenData={setTokenData} />,
<Navigate to='/' />
} else {
return <Header setTokenData={setTokenData} />,
<Navigate to='/home' />
}
export default RequireAuth;
App.js
import { Layout } from "antd";
import React from "react";
import SignUp from "./SignUp";
import Login from "./Login";
import { BrowserRouter as Router, Routes, Route } from "react-router-dom";
import Header from "./Header";
import UsersTable from "./UsersTable";
import RequireAuth from "./PrivateRoute";
const AppWrapper = () => {
return (
<>
<Layout>
<Router>
<Routes>
<Route
exact
path="/home"
element={
<RequireAuth>
<Header />
</RequireAuth>
}
/>
<Route exact path="/signUp" element={<SignUp />} />
<Route exact path="/" element={<Login />} />
<Route exact path="/usersTable" element={<UsersTable />} />
</Routes>
</Router>
</Layout>
</>
);
};
export default AppWrapper;
【问题讨论】:
标签: javascript reactjs react-router react-props