从登录页面上的API接收用户数据并在用户上下文中进行设置,在重定向到AdminPanelApp之后,用户上下文中的数据将正确显示. 但当我在AdminPanelApp上时,当我的上下文包含用户信息时,我通过地址栏转到登录页面,所有上下文用户信息都会被删除.

我如何修复该问题,使上下文信息不会被删除

picture of my app

App.js:

import React, { useState , useEffect } from "react";
import { Routes,  Route } from "react-router-dom";

import Home          from './Components/Home';
import LoginPage     from './Components/LoginPage';
import AdminPanelApp from './Components/Dashboard/AdminPanelApp';

//Context
import UserContext from "./Context/user";


    function App(){
    
        const [ userinfo , setuserinfo ] = useState({
            userid        : ''  ,
            user_name     : ''  ,
            email         : ''  ,
            token         : ''  , 
        });
    
        return(
            <UserContext.Provider value = {
               {
                userinfo : userinfo ,
                setuserinfo
               }
            }>
                <Routes>
                    <Route path="/"            element= { <LoginPage     /> } />
                    <Route path="/Login"       element= { <LoginPage     /> } />
                    <Route path="/admin-panel" element= { <AdminPanelApp /> } />
                </Routes>
    
            </UserContext.Provider>
    
        );
    }
    
    export default App;

登录Page.js:

import React , { useState , useEffect , useContext } from "react";
import { useNavigate } from "react-router-dom";
import UserContext from '../Context/user';
import '../assets/css/LoginPage.css';
import axios from "axios";

function LoginPage () {

    let navigate = useNavigate();
    const userContext  = useContext(UserContext);
    let { userinfo } = userContext;
    const [ UserNameInput  , setUserNameInput ] = useState('');
    const [ PasswordInput  , setPasswordInput ] = useState('');

    const UserNameInputHandler = (e) => {
        setUserNameInput(e.target.value)
    }

    const PasswordInputHandler = (e) => {
        setPasswordInput(e.target.value)
    }

    let FormHandler = (e)=> {

        e.preventDefault();

        axios.post(
            `http://127.0.0.1:8000/api/login`,
            {
                email    : UserNameInput  ,
                password : PasswordInput
            }
        ).then( response => {
                
                if( response.data.token ) { 
                    
                    userContext.setuserinfo({
                        userid        : response.data.userid      ,
                        user_name     : response.data.user_name   ,
                        email         : response.data.user_email  ,
                        token         : response.data.token       , 
                    })

                    navigate('/admin-panel');
                  

                }
            }
        )
         .catch( err => {
            console.log(err);
        })
    
    }

    return (

         <>
            <main>
        <form className="row g-3 needs-validation" method="post">
                      <div className="col-12">                
                           <div className="input-group has-validation">
                                <span className="input-group-text" id="inputGroupPrepend">@</span>
                                <input type="text" name="username" onChange={ UserNameInputHandler } className="form-control " id="yourUsername" required/>                
                            </div>
                           <div className="col-12">
                                <input type="password" name="password" onChange={ PasswordInputHandler } className="form-control " id="yourPassword" required/>
                           </div>
               <div className="col-12">
                                 <button className="btn btn-primary w-100" onClick={(e) => FormHandler(e) } type="submit">submit</button>
                           </div>
                 </form>
            </main>

        </>
    )

}

export default LoginPage;

AdminPage.js:

import React , { useEffect , useContext } from "react";
import { useNavigate } from "react-router-dom";

import UserContext   from '../../Context/user';
import '../../assets/css/style.css';

import Header  from './Layouts/Header';
import Sidebar from './Layouts/Sidebar';
import Footer  from './Layouts/Footer';

import Dashboard from "./Dashboard";


// import axios from "axios";


function AdminPanelApp () {

    let navigate = useNavigate();
    const userContext  = useContext(UserContext);
    let { userinfo } = userContext;

    if (userinfo.token){
        return (
            <>
                
                <h1>{ user.state.token } </h1>
               
            </>
        )
    }
    else{
        navigate('/Login');
    }
    
}

export default AdminPanelApp;

UserConext.js:

import React from "react";

const UserContext = React.createContext({
    userinfo      : {}          ,
    setUser       : () => {  }  ,
})

export default UserContext;

推荐答案

"I go to the loginpage through the address bar",你应该知道这样做会刷新页面,而使用navigate('/admin-panel')则不会.在页面刷新之后,一切都会回到它的初始值.您的上下文将采用App中提供给useState的初始对象,即:

{
  userid: "",
  user_name: "",
  email: "",
  token: "",
}

如果你不想因为页面刷新(不同的访问)而丢失数据,你应该使用例如localStorage.为此,您可以首先将FormHandler更改为:

let FormHandler = (e) => {
  e.preventDefault();

  axios
    .post(`http://127.0.0.1:8000/api/login`, {
      email: UserNameInput,
      password: PasswordInput,
    })
    .then((response) => {
      if (response.data.token) {
        let user = {
          userid: response.data.userid,
          user_name: response.data.user_name,
          email: response.data.user_email,
          token: response.data.token,
        };
        userContext.setuserinfo(user);
        localStorage.setItem("user", JSON.stringify(user));
        navigate("/admin-panel");
      }
    })
    .catch((err) => {
      console.log(err);
    });
};

并将App内的状态定义更改为:

const [userinfo, setuserinfo] = useState(
  !localStorage.getItem("user")
    ? {
        userid: "",
        user_name: "",
        email: "",
        token: "",
      }
    : JSON.parse(localStorage.getItem("user"))
);

Javascript相关问答推荐

如何在JavaScript中在文本内容中添加新行

我不知道为什么setwritten包装promise 不能像我预期的那样工作

Chrome是否忽略WebAuthentication userVerification设置?""

在网页上添加谷歌亵渎词

MathJax可以导入本地HTML文档使用的JS文件吗?

类构造函数不能在没有用With Router包装的情况下调用

React.Development.js和未捕获的ReferenceError:未定义useState

TypeError:无法分解';React2.useContext(...)';的属性';basename';,因为它为空

如何将数组用作复合函数参数?

检索相加到点的子项

VSCode中出现随机行

匹配一个或多个可选重复的特定模式

在Vercel中部署Next.js项目时获取`ReferenceError:未定义文档`

本地损坏的Java脚本

为什么NULL不能在构造函数的.Prototype中工作

按特定顺序将4个数组组合在一起,按ID分组

如何在Reaction中清除输入字段

如何在TransformControls模式下只保留箭头进行翻译?

我们是否可以在reactjs中创建多个同名的路由

JS/css:将数字输入的S函数和可调整大小的元素S函数绑定在一起