Reactjs 在React路由器中刷新页面时如何保持登录?
我正在尝试用上下文API和react路由器制作一个用户认证系统。用户登录或注册后,JWT存储在localStorage中,他们可以看到配置文件页面,但如果刷新页面,他们将注销,无法看到页面。我认为JWT不会在页面加载之前加载。我错过了一些东西,我需要帮助。我非常感激任何线索。谢谢 userAuthContext.jsReactjs 在React路由器中刷新页面时如何保持登录?,reactjs,authentication,react-router,Reactjs,Authentication,React Router,我正在尝试用上下文API和react路由器制作一个用户认证系统。用户登录或注册后,JWT存储在localStorage中,他们可以看到配置文件页面,但如果刷新页面,他们将注销,无法看到页面。我认为JWT不会在页面加载之前加载。我错过了一些东西,我需要帮助。我非常感激任何线索。谢谢 userAuthContext.js import { createContext } from "react"; const userAuthContext = createContext();
import { createContext } from "react";
const userAuthContext = createContext();
export default userAuthContext
export const USER_REGISTER_SUCCESS = 'USER_REGISTER_SUCCESS';
export const USER_LOADED = 'USER_LOADED'
export const USER_AUTH_ERROR= 'USER_AUTH_ERROR'
export const USER_REGISTER_FAIL = 'USER_REGISTER_FAIL'
export const USER_LOGIN_SUCCESS = 'USER_LOGIN_SUCCESS'
export const USER_LOGIN_FAIL = 'USER_LOGIN_FAIL'
export const USER_LOGOUT = 'USER_LOGOUT'
export const USER_CLEAR_ERRORS = 'USER_CLEAR_ERRORS'
import axios from "axios";
const setUserAuthToken = (token) => {
if (token) {
axios.defaults.headers.common = {'Authorization': `Bearer ${token}`}
} else {
delete axios.defaults.headers.common;
}
};
export default setUserAuthToken;
import {
USER_LOADED,
USER_LOGIN_SUCCESS,
USER_REGISTER_SUCCESS,
USER_LOGOUT,
USER_CLEAR_ERRORS,
USER_AUTH_ERROR,
} from "./userAuthActions";
export default (state, action) => {
switch (action.type) {
case USER_LOADED:
return {
...state,
isUserAuth: true,
loading: false,
user: action.payload,
};
case USER_REGISTER_SUCCESS:
case USER_LOGIN_SUCCESS: {
localStorage.setItem("token", action.payload.token);
return {
...state,
...action.payload,
isUserAuth: true,
loading: false,
};
}
case USER_AUTH_ERROR:
case USER_LOGOUT:
localStorage.removeItem("token");
return {
...state,
token: null,
isUserAuth: false,
loading: false,
user: null,
// error:action.payload
};
case USER_CLEAR_ERRORS:
return {
...state,
error: null,
};
default:
return state;
}
};
import { useContext} from "react";
import {Route,Redirect} from "react-router-dom";
import UserAuthContext from "../context/userAuth/userAuthContext";
const PrivateRoute = ({component:Component,...rest})=>{
const userAuthContext = useContext(UserAuthContext);
const {isUserAuth, loading} = userAuthContext;
return (
<Route
{...rest}
render={(props) =>
loading ? (
<p>Loading...</p>
) : isUserAuth ? (
<Component {...props} />
) : (
<Redirect to="/login" />
)
}
/>
);
}
export default PrivateRoute
import { BrowserRouter as Router, Route, Switch } from "react-router-dom";
import { useEffect, useContext } from "react";
import "./App.css";
import Register from "./pages/Register";
import Login from "./pages/Login";
import Profile from "./pages/Profile";
import PrivateRoute from "./routing/PrivateRoute";
import UserAuthState from "./context/userAuth/UserAuthState";
import UserAuthContext from "./context/userAuth/userAuthContext";
function App() {
const userAuthContext = useContext(UserAuthContext);
const { loadUser } = userAuthContext;
useEffect(() => {
loadUser();
}, []);
return (
<UserAuthState>
<Router>
<Switch>
<PrivateRoute exact path="/profile" component={Profile} />
<Route exact path="/register" component={Register} />
<Route exact path="/login" component={Login} />
</Switch>
</Router>
</UserAuthState>
);
}
export default App;
import { useState, useContext, useEffect } from "react";
import userAuthContext from "../context/userAuth/userAuthContext";
const Register = (props) => {
const { register, isUserAuth } = useContext(userAuthContext);
useEffect(() => {
if (isUserAuth) {
props.history.push("/profile");
}
});
const [user, setUser] = useState({
name: "",
email: "",
password: "",
});
const { name, email, password } = user;
const onChange = (event) => {
setUser({ ...user, [event.target.name]: event.target.value });
};
const onSubmit = (event) => {
event.preventDefault();
register({ name, email, password });
};
return (
<div>
<h1>
<span>Register</span> Account
</h1>
<form onSubmit={onSubmit}>
<div>
<label htmlFor="name">Name</label>
<input type="text" name="name" value={name} onChange={onChange} />
</div>
<div>
<label htmlFor="email">Email Address</label>
<input type="email" name="email" value={email} onChange={onChange} />
</div>
<div>
<label htmlFor="password">Password</label>
<input type="password" name="password" value={password} onChange={onChange} />
</div>
<input type="submit" value="Register" />
</form>
</div>
);
};
export default Register;
import {useState, useContext, useEffect} from 'react'
import UserAuthContext from "../context/userAuth/userAuthContext"
const Login = (props) => {
const userAuthContext = useContext(UserAuthContext)
const {login,isUserAuth} = userAuthContext
useEffect(()=>{
if(isUserAuth){
props.history.push("/profile")
}
},[isUserAuth,props.history])
const [user,setUser] =useState({
email:"",
password:"",
})
const {email, password} = user;
const onChange = (event) =>{
setUser({...user,[event.target.name]: event.target.value})
}
const onSubmit = (event) =>{
event.preventDefault();
login({
email,
password
})
}
return (
<div>
<h1>
<span>Login</span> Account
</h1>
<form onSubmit={onSubmit}>
<div>
<label htmlFor="email">Email Address</label>
<input type="email" name="email" value={email} onChange={onChange} />
</div>
<div>
<label htmlFor="password">Password</label>
<input
type="password"
name="password"
value={password}
onChange={onChange}
/>
</div>
<input
type="submit"
value="Login"
/>
</form>
</div>
)
}
export default Login
userAuthActions.js
import { createContext } from "react";
const userAuthContext = createContext();
export default userAuthContext
export const USER_REGISTER_SUCCESS = 'USER_REGISTER_SUCCESS';
export const USER_LOADED = 'USER_LOADED'
export const USER_AUTH_ERROR= 'USER_AUTH_ERROR'
export const USER_REGISTER_FAIL = 'USER_REGISTER_FAIL'
export const USER_LOGIN_SUCCESS = 'USER_LOGIN_SUCCESS'
export const USER_LOGIN_FAIL = 'USER_LOGIN_FAIL'
export const USER_LOGOUT = 'USER_LOGOUT'
export const USER_CLEAR_ERRORS = 'USER_CLEAR_ERRORS'
import axios from "axios";
const setUserAuthToken = (token) => {
if (token) {
axios.defaults.headers.common = {'Authorization': `Bearer ${token}`}
} else {
delete axios.defaults.headers.common;
}
};
export default setUserAuthToken;
import {
USER_LOADED,
USER_LOGIN_SUCCESS,
USER_REGISTER_SUCCESS,
USER_LOGOUT,
USER_CLEAR_ERRORS,
USER_AUTH_ERROR,
} from "./userAuthActions";
export default (state, action) => {
switch (action.type) {
case USER_LOADED:
return {
...state,
isUserAuth: true,
loading: false,
user: action.payload,
};
case USER_REGISTER_SUCCESS:
case USER_LOGIN_SUCCESS: {
localStorage.setItem("token", action.payload.token);
return {
...state,
...action.payload,
isUserAuth: true,
loading: false,
};
}
case USER_AUTH_ERROR:
case USER_LOGOUT:
localStorage.removeItem("token");
return {
...state,
token: null,
isUserAuth: false,
loading: false,
user: null,
// error:action.payload
};
case USER_CLEAR_ERRORS:
return {
...state,
error: null,
};
default:
return state;
}
};
import { useContext} from "react";
import {Route,Redirect} from "react-router-dom";
import UserAuthContext from "../context/userAuth/userAuthContext";
const PrivateRoute = ({component:Component,...rest})=>{
const userAuthContext = useContext(UserAuthContext);
const {isUserAuth, loading} = userAuthContext;
return (
<Route
{...rest}
render={(props) =>
loading ? (
<p>Loading...</p>
) : isUserAuth ? (
<Component {...props} />
) : (
<Redirect to="/login" />
)
}
/>
);
}
export default PrivateRoute
import { BrowserRouter as Router, Route, Switch } from "react-router-dom";
import { useEffect, useContext } from "react";
import "./App.css";
import Register from "./pages/Register";
import Login from "./pages/Login";
import Profile from "./pages/Profile";
import PrivateRoute from "./routing/PrivateRoute";
import UserAuthState from "./context/userAuth/UserAuthState";
import UserAuthContext from "./context/userAuth/userAuthContext";
function App() {
const userAuthContext = useContext(UserAuthContext);
const { loadUser } = userAuthContext;
useEffect(() => {
loadUser();
}, []);
return (
<UserAuthState>
<Router>
<Switch>
<PrivateRoute exact path="/profile" component={Profile} />
<Route exact path="/register" component={Register} />
<Route exact path="/login" component={Login} />
</Switch>
</Router>
</UserAuthState>
);
}
export default App;
import { useState, useContext, useEffect } from "react";
import userAuthContext from "../context/userAuth/userAuthContext";
const Register = (props) => {
const { register, isUserAuth } = useContext(userAuthContext);
useEffect(() => {
if (isUserAuth) {
props.history.push("/profile");
}
});
const [user, setUser] = useState({
name: "",
email: "",
password: "",
});
const { name, email, password } = user;
const onChange = (event) => {
setUser({ ...user, [event.target.name]: event.target.value });
};
const onSubmit = (event) => {
event.preventDefault();
register({ name, email, password });
};
return (
<div>
<h1>
<span>Register</span> Account
</h1>
<form onSubmit={onSubmit}>
<div>
<label htmlFor="name">Name</label>
<input type="text" name="name" value={name} onChange={onChange} />
</div>
<div>
<label htmlFor="email">Email Address</label>
<input type="email" name="email" value={email} onChange={onChange} />
</div>
<div>
<label htmlFor="password">Password</label>
<input type="password" name="password" value={password} onChange={onChange} />
</div>
<input type="submit" value="Register" />
</form>
</div>
);
};
export default Register;
import {useState, useContext, useEffect} from 'react'
import UserAuthContext from "../context/userAuth/userAuthContext"
const Login = (props) => {
const userAuthContext = useContext(UserAuthContext)
const {login,isUserAuth} = userAuthContext
useEffect(()=>{
if(isUserAuth){
props.history.push("/profile")
}
},[isUserAuth,props.history])
const [user,setUser] =useState({
email:"",
password:"",
})
const {email, password} = user;
const onChange = (event) =>{
setUser({...user,[event.target.name]: event.target.value})
}
const onSubmit = (event) =>{
event.preventDefault();
login({
email,
password
})
}
return (
<div>
<h1>
<span>Login</span> Account
</h1>
<form onSubmit={onSubmit}>
<div>
<label htmlFor="email">Email Address</label>
<input type="email" name="email" value={email} onChange={onChange} />
</div>
<div>
<label htmlFor="password">Password</label>
<input
type="password"
name="password"
value={password}
onChange={onChange}
/>
</div>
<input
type="submit"
value="Login"
/>
</form>
</div>
)
}
export default Login
setUserAuthToken.js
import { createContext } from "react";
const userAuthContext = createContext();
export default userAuthContext
export const USER_REGISTER_SUCCESS = 'USER_REGISTER_SUCCESS';
export const USER_LOADED = 'USER_LOADED'
export const USER_AUTH_ERROR= 'USER_AUTH_ERROR'
export const USER_REGISTER_FAIL = 'USER_REGISTER_FAIL'
export const USER_LOGIN_SUCCESS = 'USER_LOGIN_SUCCESS'
export const USER_LOGIN_FAIL = 'USER_LOGIN_FAIL'
export const USER_LOGOUT = 'USER_LOGOUT'
export const USER_CLEAR_ERRORS = 'USER_CLEAR_ERRORS'
import axios from "axios";
const setUserAuthToken = (token) => {
if (token) {
axios.defaults.headers.common = {'Authorization': `Bearer ${token}`}
} else {
delete axios.defaults.headers.common;
}
};
export default setUserAuthToken;
import {
USER_LOADED,
USER_LOGIN_SUCCESS,
USER_REGISTER_SUCCESS,
USER_LOGOUT,
USER_CLEAR_ERRORS,
USER_AUTH_ERROR,
} from "./userAuthActions";
export default (state, action) => {
switch (action.type) {
case USER_LOADED:
return {
...state,
isUserAuth: true,
loading: false,
user: action.payload,
};
case USER_REGISTER_SUCCESS:
case USER_LOGIN_SUCCESS: {
localStorage.setItem("token", action.payload.token);
return {
...state,
...action.payload,
isUserAuth: true,
loading: false,
};
}
case USER_AUTH_ERROR:
case USER_LOGOUT:
localStorage.removeItem("token");
return {
...state,
token: null,
isUserAuth: false,
loading: false,
user: null,
// error:action.payload
};
case USER_CLEAR_ERRORS:
return {
...state,
error: null,
};
default:
return state;
}
};
import { useContext} from "react";
import {Route,Redirect} from "react-router-dom";
import UserAuthContext from "../context/userAuth/userAuthContext";
const PrivateRoute = ({component:Component,...rest})=>{
const userAuthContext = useContext(UserAuthContext);
const {isUserAuth, loading} = userAuthContext;
return (
<Route
{...rest}
render={(props) =>
loading ? (
<p>Loading...</p>
) : isUserAuth ? (
<Component {...props} />
) : (
<Redirect to="/login" />
)
}
/>
);
}
export default PrivateRoute
import { BrowserRouter as Router, Route, Switch } from "react-router-dom";
import { useEffect, useContext } from "react";
import "./App.css";
import Register from "./pages/Register";
import Login from "./pages/Login";
import Profile from "./pages/Profile";
import PrivateRoute from "./routing/PrivateRoute";
import UserAuthState from "./context/userAuth/UserAuthState";
import UserAuthContext from "./context/userAuth/userAuthContext";
function App() {
const userAuthContext = useContext(UserAuthContext);
const { loadUser } = userAuthContext;
useEffect(() => {
loadUser();
}, []);
return (
<UserAuthState>
<Router>
<Switch>
<PrivateRoute exact path="/profile" component={Profile} />
<Route exact path="/register" component={Register} />
<Route exact path="/login" component={Login} />
</Switch>
</Router>
</UserAuthState>
);
}
export default App;
import { useState, useContext, useEffect } from "react";
import userAuthContext from "../context/userAuth/userAuthContext";
const Register = (props) => {
const { register, isUserAuth } = useContext(userAuthContext);
useEffect(() => {
if (isUserAuth) {
props.history.push("/profile");
}
});
const [user, setUser] = useState({
name: "",
email: "",
password: "",
});
const { name, email, password } = user;
const onChange = (event) => {
setUser({ ...user, [event.target.name]: event.target.value });
};
const onSubmit = (event) => {
event.preventDefault();
register({ name, email, password });
};
return (
<div>
<h1>
<span>Register</span> Account
</h1>
<form onSubmit={onSubmit}>
<div>
<label htmlFor="name">Name</label>
<input type="text" name="name" value={name} onChange={onChange} />
</div>
<div>
<label htmlFor="email">Email Address</label>
<input type="email" name="email" value={email} onChange={onChange} />
</div>
<div>
<label htmlFor="password">Password</label>
<input type="password" name="password" value={password} onChange={onChange} />
</div>
<input type="submit" value="Register" />
</form>
</div>
);
};
export default Register;
import {useState, useContext, useEffect} from 'react'
import UserAuthContext from "../context/userAuth/userAuthContext"
const Login = (props) => {
const userAuthContext = useContext(UserAuthContext)
const {login,isUserAuth} = userAuthContext
useEffect(()=>{
if(isUserAuth){
props.history.push("/profile")
}
},[isUserAuth,props.history])
const [user,setUser] =useState({
email:"",
password:"",
})
const {email, password} = user;
const onChange = (event) =>{
setUser({...user,[event.target.name]: event.target.value})
}
const onSubmit = (event) =>{
event.preventDefault();
login({
email,
password
})
}
return (
<div>
<h1>
<span>Login</span> Account
</h1>
<form onSubmit={onSubmit}>
<div>
<label htmlFor="email">Email Address</label>
<input type="email" name="email" value={email} onChange={onChange} />
</div>
<div>
<label htmlFor="password">Password</label>
<input
type="password"
name="password"
value={password}
onChange={onChange}
/>
</div>
<input
type="submit"
value="Login"
/>
</form>
</div>
)
}
export default Login
userAuthReducer.js
import { createContext } from "react";
const userAuthContext = createContext();
export default userAuthContext
export const USER_REGISTER_SUCCESS = 'USER_REGISTER_SUCCESS';
export const USER_LOADED = 'USER_LOADED'
export const USER_AUTH_ERROR= 'USER_AUTH_ERROR'
export const USER_REGISTER_FAIL = 'USER_REGISTER_FAIL'
export const USER_LOGIN_SUCCESS = 'USER_LOGIN_SUCCESS'
export const USER_LOGIN_FAIL = 'USER_LOGIN_FAIL'
export const USER_LOGOUT = 'USER_LOGOUT'
export const USER_CLEAR_ERRORS = 'USER_CLEAR_ERRORS'
import axios from "axios";
const setUserAuthToken = (token) => {
if (token) {
axios.defaults.headers.common = {'Authorization': `Bearer ${token}`}
} else {
delete axios.defaults.headers.common;
}
};
export default setUserAuthToken;
import {
USER_LOADED,
USER_LOGIN_SUCCESS,
USER_REGISTER_SUCCESS,
USER_LOGOUT,
USER_CLEAR_ERRORS,
USER_AUTH_ERROR,
} from "./userAuthActions";
export default (state, action) => {
switch (action.type) {
case USER_LOADED:
return {
...state,
isUserAuth: true,
loading: false,
user: action.payload,
};
case USER_REGISTER_SUCCESS:
case USER_LOGIN_SUCCESS: {
localStorage.setItem("token", action.payload.token);
return {
...state,
...action.payload,
isUserAuth: true,
loading: false,
};
}
case USER_AUTH_ERROR:
case USER_LOGOUT:
localStorage.removeItem("token");
return {
...state,
token: null,
isUserAuth: false,
loading: false,
user: null,
// error:action.payload
};
case USER_CLEAR_ERRORS:
return {
...state,
error: null,
};
default:
return state;
}
};
import { useContext} from "react";
import {Route,Redirect} from "react-router-dom";
import UserAuthContext from "../context/userAuth/userAuthContext";
const PrivateRoute = ({component:Component,...rest})=>{
const userAuthContext = useContext(UserAuthContext);
const {isUserAuth, loading} = userAuthContext;
return (
<Route
{...rest}
render={(props) =>
loading ? (
<p>Loading...</p>
) : isUserAuth ? (
<Component {...props} />
) : (
<Redirect to="/login" />
)
}
/>
);
}
export default PrivateRoute
import { BrowserRouter as Router, Route, Switch } from "react-router-dom";
import { useEffect, useContext } from "react";
import "./App.css";
import Register from "./pages/Register";
import Login from "./pages/Login";
import Profile from "./pages/Profile";
import PrivateRoute from "./routing/PrivateRoute";
import UserAuthState from "./context/userAuth/UserAuthState";
import UserAuthContext from "./context/userAuth/userAuthContext";
function App() {
const userAuthContext = useContext(UserAuthContext);
const { loadUser } = userAuthContext;
useEffect(() => {
loadUser();
}, []);
return (
<UserAuthState>
<Router>
<Switch>
<PrivateRoute exact path="/profile" component={Profile} />
<Route exact path="/register" component={Register} />
<Route exact path="/login" component={Login} />
</Switch>
</Router>
</UserAuthState>
);
}
export default App;
import { useState, useContext, useEffect } from "react";
import userAuthContext from "../context/userAuth/userAuthContext";
const Register = (props) => {
const { register, isUserAuth } = useContext(userAuthContext);
useEffect(() => {
if (isUserAuth) {
props.history.push("/profile");
}
});
const [user, setUser] = useState({
name: "",
email: "",
password: "",
});
const { name, email, password } = user;
const onChange = (event) => {
setUser({ ...user, [event.target.name]: event.target.value });
};
const onSubmit = (event) => {
event.preventDefault();
register({ name, email, password });
};
return (
<div>
<h1>
<span>Register</span> Account
</h1>
<form onSubmit={onSubmit}>
<div>
<label htmlFor="name">Name</label>
<input type="text" name="name" value={name} onChange={onChange} />
</div>
<div>
<label htmlFor="email">Email Address</label>
<input type="email" name="email" value={email} onChange={onChange} />
</div>
<div>
<label htmlFor="password">Password</label>
<input type="password" name="password" value={password} onChange={onChange} />
</div>
<input type="submit" value="Register" />
</form>
</div>
);
};
export default Register;
import {useState, useContext, useEffect} from 'react'
import UserAuthContext from "../context/userAuth/userAuthContext"
const Login = (props) => {
const userAuthContext = useContext(UserAuthContext)
const {login,isUserAuth} = userAuthContext
useEffect(()=>{
if(isUserAuth){
props.history.push("/profile")
}
},[isUserAuth,props.history])
const [user,setUser] =useState({
email:"",
password:"",
})
const {email, password} = user;
const onChange = (event) =>{
setUser({...user,[event.target.name]: event.target.value})
}
const onSubmit = (event) =>{
event.preventDefault();
login({
email,
password
})
}
return (
<div>
<h1>
<span>Login</span> Account
</h1>
<form onSubmit={onSubmit}>
<div>
<label htmlFor="email">Email Address</label>
<input type="email" name="email" value={email} onChange={onChange} />
</div>
<div>
<label htmlFor="password">Password</label>
<input
type="password"
name="password"
value={password}
onChange={onChange}
/>
</div>
<input
type="submit"
value="Login"
/>
</form>
</div>
)
}
export default Login
userAuthState
import { useReducer } from "react";
import axios from "axios";
import UserAuthContext from "./userAuthContext";
import userAuthReducer from "./userAuthReducer";
import setUserAuthToken from "../../utils/setUserAuthToken";
import {
USER_LOADED,
USER_REGISTER_SUCCESS,
USER_REGISTER_FAIL,
USER_AUTH_ERROR,
USER_LOGIN_SUCCESS,
USER_LOGIN_FAIL,
USER_LOGOUT,
USER_CLEAR_ERRORS,
} from "./userAuthActions";
const UserAuthState = (props) => {
const initialState = {
token: localStorage.getItem("token"),
isUserAuth: null,
loading: true,
user: null,
error: null,
};
const [state, dispatch] = useReducer(userAuthReducer, initialState);
const loadUser = async () => {
setUserAuthToken(localStorage.token);
try {
const res = await axios.get("/users/me");
dispatch({
type: USER_LOADED,
payload: res.data,
});
} catch (err) {
dispatch({ type: USER_AUTH_ERROR });
}
};
const register = async (formData) => {
const config = {
headers: {
"Content-Type": "application/json",
},
};
try {
const res = await axios.post("/users/register", formData, config);
dispatch({
type: USER_REGISTER_SUCCESS,
payload: res.data,
});
loadUser();
} catch (err) {
dispatch({
type: USER_REGISTER_FAIL,
});
}
};
const login = async (formData) => {
const config = {
headers: {
"Content-Type": "application/json",
},
};
try {
const res = await axios.post("/users/login", formData, config);
dispatch({
type: USER_LOGIN_SUCCESS,
payload: res.data,
});
loadUser();
} catch (err) {
dispatch({
type: USER_LOGIN_FAIL,
});
}
};
const logout = () => {
dispatch({ type: USER_LOGOUT });
};
const clearErrors = () => {
dispatch({ type: USER_CLEAR_ERRORS });
};
return (
<UserAuthContext.Provider
value={{
token: state.token,
isUserAuth: state.isUserAuth,
loading: state.loading,
user: state.user,
error: state.error,
register,
loadUser,
login,
logout,
clearErrors,
}}
>
{props.children}
</UserAuthContext.Provider>
);
};
export default UserAuthState;
从“react”导入{useReducer};
从“axios”导入axios;
从“/UserAuthContext”导入UserAuthContext;
从“/userAuthReducer”导入userAuthReducer;
从“../../utils/setUserAuthToken”导入setUserAuthToken;
进口{
用户_已加载,
用户注册成功,
用户注册失败,
用户验证错误,
用户登录成功,
用户登录失败,
用户\u注销,
用户\u清除\u错误,
}来自“/userAuthActions”;
const UserAuthState=(道具)=>{
常量初始状态={
令牌:localStorage.getItem(“令牌”),
isUserAuth:null,
加载:对,
用户:null,
错误:null,
};
const[state,dispatch]=useReducer(userAuthReducer,initialState);
const loadUser=async()=>{
setUserAuthToken(localStorage.token);
试一试{
const res=等待axios.get(“/users/me”);
派遣({
类型:用户\已加载,
有效载荷:res.data,
});
}捕捉(错误){
分派({type:USER\u AUTH\u ERROR});
}
};
常量寄存器=异步(formData)=>{
常量配置={
标题:{
“内容类型”:“应用程序/json”,
},
};
试一试{
const res=wait axios.post(“/users/register”,formData,config);
派遣({
类型:用户注册成功,
有效载荷:res.data,
});
loadUser();
}捕捉(错误){
派遣({
类型:用户注册失败,
});
}
};
const login=async(formData)=>{
常量配置={
标题:{
“内容类型”:“应用程序/json”,
},
};
试一试{
const res=wait axios.post(“/users/login”,formData,config);
派遣({
类型:用户\登录\成功,
有效载荷:res.data,
});
loadUser();
}捕捉(错误){
派遣({
类型:用户登录失败,
});
}
};
常量注销=()=>{
分派({type:USER_LOGOUT});
};
常量clearErrors=()=>{
分派({type:USER\u CLEAR\u ERRORS});
};
返回(
{props.children}
);
};
导出默认UserAuthState;
privaterout.js
import { createContext } from "react";
const userAuthContext = createContext();
export default userAuthContext
export const USER_REGISTER_SUCCESS = 'USER_REGISTER_SUCCESS';
export const USER_LOADED = 'USER_LOADED'
export const USER_AUTH_ERROR= 'USER_AUTH_ERROR'
export const USER_REGISTER_FAIL = 'USER_REGISTER_FAIL'
export const USER_LOGIN_SUCCESS = 'USER_LOGIN_SUCCESS'
export const USER_LOGIN_FAIL = 'USER_LOGIN_FAIL'
export const USER_LOGOUT = 'USER_LOGOUT'
export const USER_CLEAR_ERRORS = 'USER_CLEAR_ERRORS'
import axios from "axios";
const setUserAuthToken = (token) => {
if (token) {
axios.defaults.headers.common = {'Authorization': `Bearer ${token}`}
} else {
delete axios.defaults.headers.common;
}
};
export default setUserAuthToken;
import {
USER_LOADED,
USER_LOGIN_SUCCESS,
USER_REGISTER_SUCCESS,
USER_LOGOUT,
USER_CLEAR_ERRORS,
USER_AUTH_ERROR,
} from "./userAuthActions";
export default (state, action) => {
switch (action.type) {
case USER_LOADED:
return {
...state,
isUserAuth: true,
loading: false,
user: action.payload,
};
case USER_REGISTER_SUCCESS:
case USER_LOGIN_SUCCESS: {
localStorage.setItem("token", action.payload.token);
return {
...state,
...action.payload,
isUserAuth: true,
loading: false,
};
}
case USER_AUTH_ERROR:
case USER_LOGOUT:
localStorage.removeItem("token");
return {
...state,
token: null,
isUserAuth: false,
loading: false,
user: null,
// error:action.payload
};
case USER_CLEAR_ERRORS:
return {
...state,
error: null,
};
default:
return state;
}
};
import { useContext} from "react";
import {Route,Redirect} from "react-router-dom";
import UserAuthContext from "../context/userAuth/userAuthContext";
const PrivateRoute = ({component:Component,...rest})=>{
const userAuthContext = useContext(UserAuthContext);
const {isUserAuth, loading} = userAuthContext;
return (
<Route
{...rest}
render={(props) =>
loading ? (
<p>Loading...</p>
) : isUserAuth ? (
<Component {...props} />
) : (
<Redirect to="/login" />
)
}
/>
);
}
export default PrivateRoute
import { BrowserRouter as Router, Route, Switch } from "react-router-dom";
import { useEffect, useContext } from "react";
import "./App.css";
import Register from "./pages/Register";
import Login from "./pages/Login";
import Profile from "./pages/Profile";
import PrivateRoute from "./routing/PrivateRoute";
import UserAuthState from "./context/userAuth/UserAuthState";
import UserAuthContext from "./context/userAuth/userAuthContext";
function App() {
const userAuthContext = useContext(UserAuthContext);
const { loadUser } = userAuthContext;
useEffect(() => {
loadUser();
}, []);
return (
<UserAuthState>
<Router>
<Switch>
<PrivateRoute exact path="/profile" component={Profile} />
<Route exact path="/register" component={Register} />
<Route exact path="/login" component={Login} />
</Switch>
</Router>
</UserAuthState>
);
}
export default App;
import { useState, useContext, useEffect } from "react";
import userAuthContext from "../context/userAuth/userAuthContext";
const Register = (props) => {
const { register, isUserAuth } = useContext(userAuthContext);
useEffect(() => {
if (isUserAuth) {
props.history.push("/profile");
}
});
const [user, setUser] = useState({
name: "",
email: "",
password: "",
});
const { name, email, password } = user;
const onChange = (event) => {
setUser({ ...user, [event.target.name]: event.target.value });
};
const onSubmit = (event) => {
event.preventDefault();
register({ name, email, password });
};
return (
<div>
<h1>
<span>Register</span> Account
</h1>
<form onSubmit={onSubmit}>
<div>
<label htmlFor="name">Name</label>
<input type="text" name="name" value={name} onChange={onChange} />
</div>
<div>
<label htmlFor="email">Email Address</label>
<input type="email" name="email" value={email} onChange={onChange} />
</div>
<div>
<label htmlFor="password">Password</label>
<input type="password" name="password" value={password} onChange={onChange} />
</div>
<input type="submit" value="Register" />
</form>
</div>
);
};
export default Register;
import {useState, useContext, useEffect} from 'react'
import UserAuthContext from "../context/userAuth/userAuthContext"
const Login = (props) => {
const userAuthContext = useContext(UserAuthContext)
const {login,isUserAuth} = userAuthContext
useEffect(()=>{
if(isUserAuth){
props.history.push("/profile")
}
},[isUserAuth,props.history])
const [user,setUser] =useState({
email:"",
password:"",
})
const {email, password} = user;
const onChange = (event) =>{
setUser({...user,[event.target.name]: event.target.value})
}
const onSubmit = (event) =>{
event.preventDefault();
login({
email,
password
})
}
return (
<div>
<h1>
<span>Login</span> Account
</h1>
<form onSubmit={onSubmit}>
<div>
<label htmlFor="email">Email Address</label>
<input type="email" name="email" value={email} onChange={onChange} />
</div>
<div>
<label htmlFor="password">Password</label>
<input
type="password"
name="password"
value={password}
onChange={onChange}
/>
</div>
<input
type="submit"
value="Login"
/>
</form>
</div>
)
}
export default Login
从“react”导入{useContext};
从“react router dom”导入{Route,Redirect};
从“./context/userAuth/UserAuthContext”导入UserAuthContext;
const privaterout=({component:component,…rest})=>{
const userAuthContext=useContext(userAuthContext);
const{isUserAuth,load}=userAuthContext;
返回(
装货(
加载
):isUserAuth(
) : (
)
}
/>
);
}
导出默认PrivateRoute
App.js
import { createContext } from "react";
const userAuthContext = createContext();
export default userAuthContext
export const USER_REGISTER_SUCCESS = 'USER_REGISTER_SUCCESS';
export const USER_LOADED = 'USER_LOADED'
export const USER_AUTH_ERROR= 'USER_AUTH_ERROR'
export const USER_REGISTER_FAIL = 'USER_REGISTER_FAIL'
export const USER_LOGIN_SUCCESS = 'USER_LOGIN_SUCCESS'
export const USER_LOGIN_FAIL = 'USER_LOGIN_FAIL'
export const USER_LOGOUT = 'USER_LOGOUT'
export const USER_CLEAR_ERRORS = 'USER_CLEAR_ERRORS'
import axios from "axios";
const setUserAuthToken = (token) => {
if (token) {
axios.defaults.headers.common = {'Authorization': `Bearer ${token}`}
} else {
delete axios.defaults.headers.common;
}
};
export default setUserAuthToken;
import {
USER_LOADED,
USER_LOGIN_SUCCESS,
USER_REGISTER_SUCCESS,
USER_LOGOUT,
USER_CLEAR_ERRORS,
USER_AUTH_ERROR,
} from "./userAuthActions";
export default (state, action) => {
switch (action.type) {
case USER_LOADED:
return {
...state,
isUserAuth: true,
loading: false,
user: action.payload,
};
case USER_REGISTER_SUCCESS:
case USER_LOGIN_SUCCESS: {
localStorage.setItem("token", action.payload.token);
return {
...state,
...action.payload,
isUserAuth: true,
loading: false,
};
}
case USER_AUTH_ERROR:
case USER_LOGOUT:
localStorage.removeItem("token");
return {
...state,
token: null,
isUserAuth: false,
loading: false,
user: null,
// error:action.payload
};
case USER_CLEAR_ERRORS:
return {
...state,
error: null,
};
default:
return state;
}
};
import { useContext} from "react";
import {Route,Redirect} from "react-router-dom";
import UserAuthContext from "../context/userAuth/userAuthContext";
const PrivateRoute = ({component:Component,...rest})=>{
const userAuthContext = useContext(UserAuthContext);
const {isUserAuth, loading} = userAuthContext;
return (
<Route
{...rest}
render={(props) =>
loading ? (
<p>Loading...</p>
) : isUserAuth ? (
<Component {...props} />
) : (
<Redirect to="/login" />
)
}
/>
);
}
export default PrivateRoute
import { BrowserRouter as Router, Route, Switch } from "react-router-dom";
import { useEffect, useContext } from "react";
import "./App.css";
import Register from "./pages/Register";
import Login from "./pages/Login";
import Profile from "./pages/Profile";
import PrivateRoute from "./routing/PrivateRoute";
import UserAuthState from "./context/userAuth/UserAuthState";
import UserAuthContext from "./context/userAuth/userAuthContext";
function App() {
const userAuthContext = useContext(UserAuthContext);
const { loadUser } = userAuthContext;
useEffect(() => {
loadUser();
}, []);
return (
<UserAuthState>
<Router>
<Switch>
<PrivateRoute exact path="/profile" component={Profile} />
<Route exact path="/register" component={Register} />
<Route exact path="/login" component={Login} />
</Switch>
</Router>
</UserAuthState>
);
}
export default App;
import { useState, useContext, useEffect } from "react";
import userAuthContext from "../context/userAuth/userAuthContext";
const Register = (props) => {
const { register, isUserAuth } = useContext(userAuthContext);
useEffect(() => {
if (isUserAuth) {
props.history.push("/profile");
}
});
const [user, setUser] = useState({
name: "",
email: "",
password: "",
});
const { name, email, password } = user;
const onChange = (event) => {
setUser({ ...user, [event.target.name]: event.target.value });
};
const onSubmit = (event) => {
event.preventDefault();
register({ name, email, password });
};
return (
<div>
<h1>
<span>Register</span> Account
</h1>
<form onSubmit={onSubmit}>
<div>
<label htmlFor="name">Name</label>
<input type="text" name="name" value={name} onChange={onChange} />
</div>
<div>
<label htmlFor="email">Email Address</label>
<input type="email" name="email" value={email} onChange={onChange} />
</div>
<div>
<label htmlFor="password">Password</label>
<input type="password" name="password" value={password} onChange={onChange} />
</div>
<input type="submit" value="Register" />
</form>
</div>
);
};
export default Register;
import {useState, useContext, useEffect} from 'react'
import UserAuthContext from "../context/userAuth/userAuthContext"
const Login = (props) => {
const userAuthContext = useContext(UserAuthContext)
const {login,isUserAuth} = userAuthContext
useEffect(()=>{
if(isUserAuth){
props.history.push("/profile")
}
},[isUserAuth,props.history])
const [user,setUser] =useState({
email:"",
password:"",
})
const {email, password} = user;
const onChange = (event) =>{
setUser({...user,[event.target.name]: event.target.value})
}
const onSubmit = (event) =>{
event.preventDefault();
login({
email,
password
})
}
return (
<div>
<h1>
<span>Login</span> Account
</h1>
<form onSubmit={onSubmit}>
<div>
<label htmlFor="email">Email Address</label>
<input type="email" name="email" value={email} onChange={onChange} />
</div>
<div>
<label htmlFor="password">Password</label>
<input
type="password"
name="password"
value={password}
onChange={onChange}
/>
</div>
<input
type="submit"
value="Login"
/>
</form>
</div>
)
}
export default Login
从“react Router dom”导入{BrowserRouter as Router,Route,Switch};
从“react”导入{useEffect,useContext};
导入“/App.css”;
从“/pages/Register”导入注册表;
从“/pages/Login”导入登录名;
从“/pages/Profile”导入配置文件;
从“/routing/PrivateRoute”导入PrivateRoute;
从“/context/userAuth/UserAuthState”导入UserAuthState;
从“/context/userAuth/UserAuthContext”导入UserAuthContext;
函数App(){
const userAuthContext=useContext(userAuthContext);
const{loadUser}=userAuthContext;
useffect(()=>{
loadUser();
}, []);
返回(
);
}
导出默认应用程序;
我认为注册和登录页面很好,但我把它们放在这里以防万一。配置文件页面只是一个带有文本的组件
Register.js
import { createContext } from "react";
const userAuthContext = createContext();
export default userAuthContext
export const USER_REGISTER_SUCCESS = 'USER_REGISTER_SUCCESS';
export const USER_LOADED = 'USER_LOADED'
export const USER_AUTH_ERROR= 'USER_AUTH_ERROR'
export const USER_REGISTER_FAIL = 'USER_REGISTER_FAIL'
export const USER_LOGIN_SUCCESS = 'USER_LOGIN_SUCCESS'
export const USER_LOGIN_FAIL = 'USER_LOGIN_FAIL'
export const USER_LOGOUT = 'USER_LOGOUT'
export const USER_CLEAR_ERRORS = 'USER_CLEAR_ERRORS'
import axios from "axios";
const setUserAuthToken = (token) => {
if (token) {
axios.defaults.headers.common = {'Authorization': `Bearer ${token}`}
} else {
delete axios.defaults.headers.common;
}
};
export default setUserAuthToken;
import {
USER_LOADED,
USER_LOGIN_SUCCESS,
USER_REGISTER_SUCCESS,
USER_LOGOUT,
USER_CLEAR_ERRORS,
USER_AUTH_ERROR,
} from "./userAuthActions";
export default (state, action) => {
switch (action.type) {
case USER_LOADED:
return {
...state,
isUserAuth: true,
loading: false,
user: action.payload,
};
case USER_REGISTER_SUCCESS:
case USER_LOGIN_SUCCESS: {
localStorage.setItem("token", action.payload.token);
return {
...state,
...action.payload,
isUserAuth: true,
loading: false,
};
}
case USER_AUTH_ERROR:
case USER_LOGOUT:
localStorage.removeItem("token");
return {
...state,
token: null,
isUserAuth: false,
loading: false,
user: null,
// error:action.payload
};
case USER_CLEAR_ERRORS:
return {
...state,
error: null,
};
default:
return state;
}
};
import { useContext} from "react";
import {Route,Redirect} from "react-router-dom";
import UserAuthContext from "../context/userAuth/userAuthContext";
const PrivateRoute = ({component:Component,...rest})=>{
const userAuthContext = useContext(UserAuthContext);
const {isUserAuth, loading} = userAuthContext;
return (
<Route
{...rest}
render={(props) =>
loading ? (
<p>Loading...</p>
) : isUserAuth ? (
<Component {...props} />
) : (
<Redirect to="/login" />
)
}
/>
);
}
export default PrivateRoute
import { BrowserRouter as Router, Route, Switch } from "react-router-dom";
import { useEffect, useContext } from "react";
import "./App.css";
import Register from "./pages/Register";
import Login from "./pages/Login";
import Profile from "./pages/Profile";
import PrivateRoute from "./routing/PrivateRoute";
import UserAuthState from "./context/userAuth/UserAuthState";
import UserAuthContext from "./context/userAuth/userAuthContext";
function App() {
const userAuthContext = useContext(UserAuthContext);
const { loadUser } = userAuthContext;
useEffect(() => {
loadUser();
}, []);
return (
<UserAuthState>
<Router>
<Switch>
<PrivateRoute exact path="/profile" component={Profile} />
<Route exact path="/register" component={Register} />
<Route exact path="/login" component={Login} />
</Switch>
</Router>
</UserAuthState>
);
}
export default App;
import { useState, useContext, useEffect } from "react";
import userAuthContext from "../context/userAuth/userAuthContext";
const Register = (props) => {
const { register, isUserAuth } = useContext(userAuthContext);
useEffect(() => {
if (isUserAuth) {
props.history.push("/profile");
}
});
const [user, setUser] = useState({
name: "",
email: "",
password: "",
});
const { name, email, password } = user;
const onChange = (event) => {
setUser({ ...user, [event.target.name]: event.target.value });
};
const onSubmit = (event) => {
event.preventDefault();
register({ name, email, password });
};
return (
<div>
<h1>
<span>Register</span> Account
</h1>
<form onSubmit={onSubmit}>
<div>
<label htmlFor="name">Name</label>
<input type="text" name="name" value={name} onChange={onChange} />
</div>
<div>
<label htmlFor="email">Email Address</label>
<input type="email" name="email" value={email} onChange={onChange} />
</div>
<div>
<label htmlFor="password">Password</label>
<input type="password" name="password" value={password} onChange={onChange} />
</div>
<input type="submit" value="Register" />
</form>
</div>
);
};
export default Register;
import {useState, useContext, useEffect} from 'react'
import UserAuthContext from "../context/userAuth/userAuthContext"
const Login = (props) => {
const userAuthContext = useContext(UserAuthContext)
const {login,isUserAuth} = userAuthContext
useEffect(()=>{
if(isUserAuth){
props.history.push("/profile")
}
},[isUserAuth,props.history])
const [user,setUser] =useState({
email:"",
password:"",
})
const {email, password} = user;
const onChange = (event) =>{
setUser({...user,[event.target.name]: event.target.value})
}
const onSubmit = (event) =>{
event.preventDefault();
login({
email,
password
})
}
return (
<div>
<h1>
<span>Login</span> Account
</h1>
<form onSubmit={onSubmit}>
<div>
<label htmlFor="email">Email Address</label>
<input type="email" name="email" value={email} onChange={onChange} />
</div>
<div>
<label htmlFor="password">Password</label>
<input
type="password"
name="password"
value={password}
onChange={onChange}
/>
</div>
<input
type="submit"
value="Login"
/>
</form>
</div>
)
}
export default Login
从“react”导入{useState,useContext,useffect};
从“./context/userAuth/userAuthContext”导入userAuthContext;
常量寄存器=(道具)=>{
const{register,isUserAuth}=useContext(userAuthContext);
useffect(()=>{
if(isUserAuth){
道具。历史。推送(“/profile”);
}
});
const[user,setUser]=useState({
姓名:“,
电邮:“,
密码:“”,
});
const{name,email,password}=user;
const onChange=(事件)=>{
setUser({…user[event.target.name]:event.target.value});
};
const onSubmit=(事件)=>{
event.preventDefault();
注册({姓名、电子邮件、密码});
};
返回(
登记帐户
名称
电子邮件地址
密码
);
};
导出默认寄存器;
Login.js
import { createContext } from "react";
const userAuthContext = createContext();
export default userAuthContext
export const USER_REGISTER_SUCCESS = 'USER_REGISTER_SUCCESS';
export const USER_LOADED = 'USER_LOADED'
export const USER_AUTH_ERROR= 'USER_AUTH_ERROR'
export const USER_REGISTER_FAIL = 'USER_REGISTER_FAIL'
export const USER_LOGIN_SUCCESS = 'USER_LOGIN_SUCCESS'
export const USER_LOGIN_FAIL = 'USER_LOGIN_FAIL'
export const USER_LOGOUT = 'USER_LOGOUT'
export const USER_CLEAR_ERRORS = 'USER_CLEAR_ERRORS'
import axios from "axios";
const setUserAuthToken = (token) => {
if (token) {
axios.defaults.headers.common = {'Authorization': `Bearer ${token}`}
} else {
delete axios.defaults.headers.common;
}
};
export default setUserAuthToken;
import {
USER_LOADED,
USER_LOGIN_SUCCESS,
USER_REGISTER_SUCCESS,
USER_LOGOUT,
USER_CLEAR_ERRORS,
USER_AUTH_ERROR,
} from "./userAuthActions";
export default (state, action) => {
switch (action.type) {
case USER_LOADED:
return {
...state,
isUserAuth: true,
loading: false,
user: action.payload,
};
case USER_REGISTER_SUCCESS:
case USER_LOGIN_SUCCESS: {
localStorage.setItem("token", action.payload.token);
return {
...state,
...action.payload,
isUserAuth: true,
loading: false,
};
}
case USER_AUTH_ERROR:
case USER_LOGOUT:
localStorage.removeItem("token");
return {
...state,
token: null,
isUserAuth: false,
loading: false,
user: null,
// error:action.payload
};
case USER_CLEAR_ERRORS:
return {
...state,
error: null,
};
default:
return state;
}
};
import { useContext} from "react";
import {Route,Redirect} from "react-router-dom";
import UserAuthContext from "../context/userAuth/userAuthContext";
const PrivateRoute = ({component:Component,...rest})=>{
const userAuthContext = useContext(UserAuthContext);
const {isUserAuth, loading} = userAuthContext;
return (
<Route
{...rest}
render={(props) =>
loading ? (
<p>Loading...</p>
) : isUserAuth ? (
<Component {...props} />
) : (
<Redirect to="/login" />
)
}
/>
);
}
export default PrivateRoute
import { BrowserRouter as Router, Route, Switch } from "react-router-dom";
import { useEffect, useContext } from "react";
import "./App.css";
import Register from "./pages/Register";
import Login from "./pages/Login";
import Profile from "./pages/Profile";
import PrivateRoute from "./routing/PrivateRoute";
import UserAuthState from "./context/userAuth/UserAuthState";
import UserAuthContext from "./context/userAuth/userAuthContext";
function App() {
const userAuthContext = useContext(UserAuthContext);
const { loadUser } = userAuthContext;
useEffect(() => {
loadUser();
}, []);
return (
<UserAuthState>
<Router>
<Switch>
<PrivateRoute exact path="/profile" component={Profile} />
<Route exact path="/register" component={Register} />
<Route exact path="/login" component={Login} />
</Switch>
</Router>
</UserAuthState>
);
}
export default App;
import { useState, useContext, useEffect } from "react";
import userAuthContext from "../context/userAuth/userAuthContext";
const Register = (props) => {
const { register, isUserAuth } = useContext(userAuthContext);
useEffect(() => {
if (isUserAuth) {
props.history.push("/profile");
}
});
const [user, setUser] = useState({
name: "",
email: "",
password: "",
});
const { name, email, password } = user;
const onChange = (event) => {
setUser({ ...user, [event.target.name]: event.target.value });
};
const onSubmit = (event) => {
event.preventDefault();
register({ name, email, password });
};
return (
<div>
<h1>
<span>Register</span> Account
</h1>
<form onSubmit={onSubmit}>
<div>
<label htmlFor="name">Name</label>
<input type="text" name="name" value={name} onChange={onChange} />
</div>
<div>
<label htmlFor="email">Email Address</label>
<input type="email" name="email" value={email} onChange={onChange} />
</div>
<div>
<label htmlFor="password">Password</label>
<input type="password" name="password" value={password} onChange={onChange} />
</div>
<input type="submit" value="Register" />
</form>
</div>
);
};
export default Register;
import {useState, useContext, useEffect} from 'react'
import UserAuthContext from "../context/userAuth/userAuthContext"
const Login = (props) => {
const userAuthContext = useContext(UserAuthContext)
const {login,isUserAuth} = userAuthContext
useEffect(()=>{
if(isUserAuth){
props.history.push("/profile")
}
},[isUserAuth,props.history])
const [user,setUser] =useState({
email:"",
password:"",
})
const {email, password} = user;
const onChange = (event) =>{
setUser({...user,[event.target.name]: event.target.value})
}
const onSubmit = (event) =>{
event.preventDefault();
login({
email,
password
})
}
return (
<div>
<h1>
<span>Login</span> Account
</h1>
<form onSubmit={onSubmit}>
<div>
<label htmlFor="email">Email Address</label>
<input type="email" name="email" value={email} onChange={onChange} />
</div>
<div>
<label htmlFor="password">Password</label>
<input
type="password"
name="password"
value={password}
onChange={onChange}
/>
</div>
<input
type="submit"
value="Login"
/>
</form>
</div>
)
}
export default Login
从'react'导入{useState,useContext,useffect}
从“./context/userAuth/UserAuthContext”导入UserAuthContext
常量登录=(道具)=>{
常量userAuth