从 axios 响应中反应更新状态

React update state from the axios response

我一直在尝试构建此身份验证验证组件,但一直卡住了。

我想做的是向我的后端服务器发出 axios get 请求以验证是否 用户已登录。后端部分工作正常。请记住,cookie 在存在时发送。发生的事情是我将用户的 cookies & headers 与请求一起发送到后端,然后服务器对其进行验证,然后发回成功响应。我正在尝试根据 axios 响应更改反应 useState 的状态。

这是我当前的代码:

import { useEffect, useState } from 'react';
import { Navigate, Outlet } from 'react-router-dom';
import apiurl from '../axios'; // custom axios interceptor

const AuthVerifyFunction = () => {
    const [isAuth, setIsAuth] = useState();

    const config = {
        headers: {
            "Content-Type": "application/json",
            "X-Requested-With": "XMLHttpRequest"
        }
    }

    const verifyAuth = () => {
        apiurl.get('/api/auth/verify', config)
            .then(res => {
                setIsAuth(res.data.success)
                console.log(res)
                console.log("isAuth:", isAuth);
            })
            .catch(err => {
                console.log(err)
            });
    }

    useEffect(() => {
        verifyAuth();
    }, []);

    return (
        <h1>{isAuth ? <Outlet /> : <Navigate to="/login" />}</h1>
    )

}

export default AuthVerifyFunction;

这是我返回的成功响应:

{data: {…}, status: 200, statusText: 'OK', headers: {…}, config: {…}, …}
  config: {transitional: {…}, transformRequest: Array(1), transformResponse: Array(1), timeout: 0, adapter: ƒ, …}
  data: {success: true, authHeader: 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZC…Tg4fQ.lX8piOnRb9-MQCS8mibMSmFfjBcCeTaC7sw-DgdwBl8'}
  headers: {content-length: '230', content-type: 'application/json; charset=utf-8'}
  request: XMLHttpRequest {onreadystatechange: null, readyState: 4, timeout: 0, withCredentials: true, upload: XMLHttpRequestUpload, …}
  status: 200
  statusText: "OK"
  [[Prototype]]: Object

我一直坚持的部分是我不知道如何在异步响应之前不重定向用户,或者简单地说,我只想在 response.data.success 时显示出口是 true,如果不是,则将它们重定向到 /login。

如果有任何其他更好的方法可以做到这一点,请告诉我。提前谢谢你。

也许你应该声明你的初始状态,这样它就不会为空

 const [isAuth, setIsAuth] = useState(false);

您可以使用 isLoading 状态:当您收到来自 API:

的响应时,将其设置为 false
import { useEffect, useState } from 'react';
import { Navigate, Outlet } from 'react-router-dom';
import apiurl from '../axios'; // custom axios interceptor

const AuthVerifyFunction = () => {
  const [isLoading, setIsLoading] = useState(true);
  const [isAuth, setIsAuth] = useState();

  const config = {
    headers: {
      'Content-Type': 'application/json',
      'X-Requested-With': 'XMLHttpRequest',
    },
  };

  const verifyAuth = () => {
    apiurl
      .get('/api/auth/verify', config)
      .then((res) => {
        setIsAuth(res.data.success);
        setIsLoading(false);
        console.log(res);
        console.log('isAuth:', isAuth);
      })
      .catch((err) => {
        console.log(err);
      });
  };

  useEffect(() => {
    verifyAuth();
  }, []);

  return (
    <h1>
      {isLoading ? (
        'Authenticating...'
      ) : isAuth ? (
        <Outlet />
      ) : (
        <Navigate to='/login' />
      )}
    </h1>
  );
};

export default AuthVerifyFunction;