useEffect 无限循环与 useState

时间:2021-06-11 06:28:33

标签: reactjs react-hooks use-effect use-state use-context

我正在尝试检查 authState 是否为 true 以向用户显示我的侧边栏。它有效,但我得到了一个无限循环。

这里是 useEffect 和 useState

const [ authState, setAuthState ] = useState({
      username: "", 
      id: 0, 
      status: false
    });

useEffect(() => {
   axios.get('http://localhost:4000/users/auth/v', {withCredentials: true}).then((res) => {
        console.log(res.data);
        if (res.data.error) {
          setAuthState({ ...authState, status: false });
        } else {
          setAuthState({
            username: res.data.username, 
            id: res.data.id, 
            status: true
          });
          console.log(authState);
        }
      });

  },[authState]);

编辑:我实际上使用的是 useContext

  return (
    <>
      <AuthContext.Provider value={{ authState, setAuthState }}>
        <Router>
        <Sidebar />
          <Switch>
            <Route path='/' exact component={Auth} />
            <Route path='/users/add' exact component={AddUser} />
            <Route path='/users' exact component={UserList} />
            <Route path='/users/:id' exact component={UserEdit} />
            <Route path='/roles/add' exact component={AddRole} />
            <Route path='/roles' exact component={RoleList} />
            <Route path='/roles/:roleId' exact component={EditRole} />
            <Route path='/logout' exact component={Logout} />
          </Switch>
        </Router>
      </AuthContext.Provider>
    </>
  );
}

更新

现在使用此代码,但当我进入时,例如,让我们说 /users 我需要刷新页面,让 authState 的状态被识别为 {{ 1}} 通过侧边栏然后侧边栏出现

true

这是我的侧边栏

  useEffect(() => {
    axios.get('http://localhost:4000/users/auth/v', {withCredentials: true}).then((res) => {
      console.log(res.data);
      if (res.data.error) {
        setAuthState({ ...authState, status: false });
      } else {
        setAuthState({
          username: res.data.username, 
          id: res.data.id, 
          status: true
        });
      }
    });
  },[]);

2 个答案:

答案 0 :(得分:0)

由于在 useEffect 结束时您正在更改 authState,它再次调用 useEffect。我建议有一个标志来触发检查 authState 是否更新并停止循环,代码可能有点错误,因为我刚刚在这里写的 :P,在调用 setAuthState 之前,您还必须将 updateAuth 设置为 true。如果你想让它像 Hamza Khursheed 所说的那样只在开始时运行,只需从依赖数组中移除 authState(使用效果的第二个参数)

const [ authState, setAuthState ] = useState({
  username: "", 
  id: 0, 
  status: false
});
const [ updateAuth, setUpdateAuthState ] = useState(false)

 useEffect(() => {
  if(updateAuth){
    axios.get('http://localhost:4000/users/auth/v', {withCredentials: 
        true}).then((res) => {
       console.log(res.data);
    if (res.data.error) {
      setAuthState({ ...authState, status: false });
    } else {
      setAuthState({
        username: res.data.username, 
        id: res.data.id, 
        status: true
      });
      setUpdateAuthState(false);
      console.log(authState);
    }
  });
 }
 },[authState]);

答案 1 :(得分:0)

您应该调整您的依赖项数组以反映您希望 useEffect 触发的更改。如果您想在路线更改时获得授权状态,这应该可行:

React.useEffect(() => {
    axios
        .get('http://localhost:4000/users/auth/v', { withCredentials: true })
        .then((res) => {
            console.log(res.data);
            if (res.data.error) {
                setAuthState({ ...authState, status: false });
            } else {
                setAuthState({
                    username: res.data.username,
                    id: res.data.id,
                    status: true,
                });
                console.log(authState);
            }
        });
}, [window.location.pathname]);