每次刷新页面时 React Context 数据都未定义

Posted

技术标签:

【中文标题】每次刷新页面时 React Context 数据都未定义【英文标题】:React Context data got undefined everytime refresh page 【发布时间】:2021-11-09 06:38:35 【问题描述】:

我正在制作一个简单的 SPA,您需要先登录才能访问其他页面。我可以成功登录并存储登录数据(名字、姓氏等),因为我计划稍后在其他页面中再次使用这些数据。问题是每当我刷新页面时,它总是清空上下文中的状态,这导致我返回登录页面。我指的是 link 我的 SPA。

需要this吗?如果有人能指出我应该改变/改进的地方,我将不胜感激。谢谢。

这是我的代码。

App.js

import React,  useState  from "react";
import  BrowserRouter as Router, Link, Route  from "react-router-dom";

import  AuthContext  from "./context/auth";
import PrivateRoute from "./PrivateRoute";

import Login from "./pages/Login";
import Signup from "./pages/Signup";
import Home from "./pages/Home";
import Admin from "./pages/Admin";

function App() 
  const [authTokens, setAuthTokens] = useState();

  const setTokens = (data) => 
    // console.log("DATA ",data);
    localStorage.setItem("tokens", JSON.stringify(data));
    setAuthTokens(data);
  

  // console.log(authTokens);

  return (
    <AuthContext.Provider value= authTokens, setAuthTokens: setTokens >
      <Router>
        <div className="app">
          <ul>
            <li><Link to="/">Home Page</Link></li>
            <li><Link to="/admin">Admin Page</Link></li>
          </ul>
          <Route exact path="/login" component=Login />
          <Route exact path="/signup" component=Signup />
          <Route exact path="/" component=Home />
          <PrivateRoute exact path="/admin" component=Admin />
        </div>
      </Router>
    </AuthContext.Provider>
  );


export default App;
Login.js

import React,  useState  from "react";
import axios from "axios";
import  Link, Redirect  from "react-router-dom";

import  useAuth  from "../context/auth";

import  Card, Form, Input, Button, Error  from "../components/AuthForm";

const Login = () => 
  const [isLoggedIn, setLoggedIn] = useState(false);
  const [isError, setIsError] = useState(false);
  const [email, setEmail] = useState("");
  const [password, setPassword] = useState("");
  const  setAuthTokens  = useAuth();

  const handleLogin = () => 
    axios
      .post("LOGINLINK", 
        email,
        password,
      )
      .then((result) => 
        if (result.status === 200) 
          setAuthTokens(result.data);
          setLoggedIn(true);
         else 
          setIsError(true);
        
      )
      .catch((error) => 
        setIsError(true);
      );
  ;

  if (isLoggedIn) 
    return <Redirect to="/" />;
  

  return (
    <Card>
      <Form>
        <Input
          type="email"
          placeholder="Email"
          value=email
          onChange=(e) => 
            setEmail(e.target.value);
          
        />
        <Input
          type="password"
          placeholder="password"
          value=password
          onChange=(e) => 
            setPassword(e.target.value);
          
        />
        <Button onClick=handleLogin>Login</Button>
      </Form>
      <Link to="/signup">Don't have an account?</Link>
      isError && (
        <Error>The username or password provided were incorrect!</Error>
      )
    </Card>
  );
;

export default Login;

Auth.js

import  createContext, useContext  from "react";

export const AuthContext = createContext();

export function useAuth() 
  console.log("CONTEXT", useContext(AuthContext));
  return useContext(AuthContext);

【问题讨论】:

【参考方案1】:

在您的 App 组件中,您需要在初始化状态时从 localStorage 获取数据,以便它有一些数据可以开始。

const localToken = JSON.parse(localStorage.getItem("tokens"));
const [authTokens, setAuthTokens] = useState(localToken);

如果用户已经通过身份验证,它将在 localStorage 中可用,否则它将为空。

【讨论】:

您好,感谢您的回复。它可以工作,但是当我尝试注销时出现错误。它说“引发了跨域错误。React 无法访问开发中的实际错误对象。”跟我的后台有关系吗?或者我可以从我的前端修复它? 如果您的 React 应用程序托管在一个域中并且您的后端位于不同的域中,那么您会收到 CORS 错误,那么您使用的后端是 node 和 express 吗? 是的,我正在使用节点和快递 然后安装这个库 npmjs.com/package/cors 并将该中间件与您的应用程序一起使用,这将解决错误并阅读 CORS 及其是什么,以便您了解它 好吧原来已经有CORS中间件了。我清除了本地存储以进行注销,现在它运行良好。以前当我注销时,仍然有未定义值的“令牌”。现在它只是一个空的本地存储。

以上是关于每次刷新页面时 React Context 数据都未定义的主要内容,如果未能解决你的问题,请参考以下文章

React 应用程序网站页面仅在刷新时加载

React.js身份验证在每次刷新时重定向到登录名

使用react-google-maps刷新不需要的页面。

React/Firebase 托管:为啥在页面刷新时要求用户登录?

JSF子页面每次都保留上次的数据,需要手动刷新一下, 该如何解决?

每次刷新页面时,PHP 电子邮件表单都会发送电子邮件