反应useState不变

时间:2020-01-08 16:02:36

标签: javascript reactjs react-hooks

我试图在react中设置经过身份验证的路由,并在用户经过身份验证后将useState挂钩更改为true。从服务器获取用户数据时,我可以更新当前用户信息,但是用于身份验证的useState钩子不会从true更改为false,反之亦然。

import { useState, useEffect, useContext } from "react";
import { UserContext } from "./UserContext";
import ApiHandler from "../ApiHandler/ApiHandler";

const api = new ApiHandler();
export const useAuth = () => {
  const [isLoggedIn, setIsLoggedIn] = useState(false);
  const userContext = useContext(UserContext);
  const { currentUser, setCurrentUser } = userContext;

  useEffect(() => {
    api
      .get("/is-loggedin")
      .then(res => {
        setCurrentUser(res.data.currentUser);
        setIsLoggedIn(true);
      })
      .catch(err => {
        setCurrentUser(null);
        setIsLoggedIn(false);
      });
  }, [setCurrentUser]);
  return { isLoggedIn, currentUser };
};

3 个答案:

答案 0 :(得分:0)

我认为问题在于useEffect第二个参数dependencies array没有正确的依赖性。

useEffect(() => { /* rest of the code */ }, [setCurrentUser]);

更改为

useEffect(() => { /* rest of the code */ }, [setCurrentUser, isLoggedIn]);

答案 1 :(得分:0)

在挂钩中声明您的方法,然后调用。添加具有注释的三行。另外,currentUser是依赖项,因为如果用户更改了,您将检查它是否已登录。您的错误是

1)-在依赖项中传递setCurrentUser(因为它是函数/处理程序,所以永远不会改变)。
2)-既未声明方法也未调用方法,而只是将语句传递给useEffect,后者仅运行一次。

import { useState, useEffect, useContext } from "react";
import { UserContext } from "./UserContext";
import ApiHandler from "../ApiHandler/ApiHandler";

const api = new ApiHandler();
export const useAuth = () => {
  const [isLoggedIn, setIsLoggedIn] = useState(false);
  const userContext = useContext(UserContext);
  const { currentUser, setCurrentUser } = userContext;

  useEffect(() => {
    function getStatus() { //method body starts
      api.get("/is-loggedin")
      .then(res => {
        setCurrentUser(res.data.currentUser);
        setIsLoggedIn(true);
      })
      .catch(err => {
        setCurrentUser(null);
        setIsLoggedIn(false);
      });
   }; //method body closed.
   getStatus(); //this is the call
  }, [currentUser]);
  return { isLoggedIn, currentUser };
};

答案 2 :(得分:0)

只需将一个空数组用于useEffect

          useEffect(() => {
            api
              .get("/is-loggedin")
              .then(res => {
                setCurrentUser(res.data.currentUser);
                setIsLoggedIn(true);
              })
              .catch(err => {
                setCurrentUser(null);
                setIsLoggedIn(false);
              });
          }, []);