Reactjs 在React路由器中刷新页面时如何保持登录?

Reactjs 在React路由器中刷新页面时如何保持登录?,reactjs,authentication,react-router,Reactjs,Authentication,React Router,我正在尝试用上下文API和react路由器制作一个用户认证系统。用户登录或注册后,JWT存储在localStorage中,他们可以看到配置文件页面,但如果刷新页面,他们将注销,无法看到页面。我认为JWT不会在页面加载之前加载。我错过了一些东西,我需要帮助。我非常感激任何线索。谢谢 userAuthContext.js import { createContext } from "react"; const userAuthContext = createContext();

我正在尝试用上下文API和react路由器制作一个用户认证系统。用户登录或注册后,JWT存储在localStorage中,他们可以看到配置文件页面,但如果刷新页面,他们将注销,无法看到页面。我认为JWT不会在页面加载之前加载。我错过了一些东西,我需要帮助。我非常感激任何线索。谢谢

userAuthContext.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

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