首页 > 解决方案 > 尝试检查用户是否登录时的useEffect无限循环

问题描述

我正在使用 auth0,并且当应用程序重新渲染时可能在页面刷新时,我尝试使用 auth0 做几件事,第一个是检查用户是否经过身份验证,以及他是否将他的令牌和用户对象保存在mobx 商店,否则将他重定向到登录页面。这是我目前使用的代码:

// appLoaded --> to check if the user is logged in (app cannot be used without a user)

const App: React.FC = () => {
  const {
    // isAuthenticated,
    user,
    getIdTokenClaims,
    loginWithRedirect,
    isAuthenticated
  } = useAuth0();

  const {
    sideNavStore: { isOpen, toggleSideBar },
    authStore: { setAppLoaded, setToken, setUser, appLoaded }
  } = useStore();

  // get the user from auth0 and store their details in the mobx store;
  useEffect(() => {
    if (isAuthenticated) {
      getIdTokenClaims().then((response) => {
        // eslint-disable-next-line no-underscore-dangle
        setToken(response.__raw);
        setUser(user);
      });
    } else {
      loginWithRedirect().then(() => {
        setAppLoaded(false);
      });
    }
  }, [
    isAuthenticated,
    setToken,
    setUser,
    setAppLoaded,
    loginWithRedirect,
    getIdTokenClaims,
    user
  ]);

  if (!appLoaded) return <PreLoader />;
return (
// some component code
)}

我在上面的代码中遇到了一个无限循环。我已经在这个问题上讨论了一天,只是决定在这里提问。谁能告诉我我做错了什么?谢谢

标签: javascriptreactjsauth0use-effectmobx

解决方案


useEffect您不应该从其中更新 a所依赖的任何状态。这会创建一个无限循环。

您对单一的依赖项太多,useEffect并且正在更新其中的一些。将您的代码拆分为useEffect具有较少依赖项的多个代码,确保它们中的每一个都不会更新它自己的依赖项


推荐阅读