Reactjs 对用户身份验证使用状态挂钩作出反应

Reactjs 对用户身份验证使用状态挂钩作出反应,reactjs,Reactjs,我在学习反应,我在用passport js进行谷歌认证 所以当用户登陆我的页面时,他们没有经过身份验证,所以我有一个按钮让他们通过谷歌登录。一旦他们登录,我会用他们的名字将他们重定向到我的主页,简单地说他们已登录,它会显示一个注销按钮 现在这就是问题所在,在我将他们注销后,我将我的状态设置回false,但它会将他们的姓名和登录消息呈现回主页 我用spread操作符修复了它,但我不知道为什么它能工作。我似乎不能把我的头围绕着它 有人能分享一下吗?干杯 import { useState,

我在学习反应,我在用passport js进行谷歌认证

所以当用户登陆我的页面时,他们没有经过身份验证,所以我有一个按钮让他们通过谷歌登录。一旦他们登录,我会用他们的名字将他们重定向到我的主页,简单地说他们已登录,它会显示一个注销按钮

现在这就是问题所在,在我将他们注销后,我将我的状态设置回false,但它会将他们的姓名和登录消息呈现回主页

我用spread操作符修复了它,但我不知道为什么它能工作。我似乎不能把我的头围绕着它

有人能分享一下吗?干杯

    import { useState, useEffect } from 'react';
import * as api from '../api/index';
import Header from './Header';

function Home() {
  const [user, setUser] = useState({
    user: {},
    error: null,
    authenticated: false
  });

  useEffect(() => {
    const fetchLoggedInUser = async () => {
      try {
        const { data } = await api.loginSucess();
        setUser({ authenticated: true, user: data.user });
      } catch (error) {
        setUser({ authenticated: false, error: 'Failed to authenticate user' });
      }
    };
    fetchLoggedInUser();
  }, []);

  const handleNotAuthenticated = () => {
    setUser(...user, { authenticated: false });
  };

  return (
    <>
      <Header
        authenticated={user.authenticated}
        handleNotAuthenticated={handleNotAuthenticated}
      />
      <div>
        {!user.authenticated ? (
          'Welcome'
        ) : (
          <div>
            <h1>You have sucessfully logged in</h1>
            <h2>Welcome {user.user.firstName}</h2>
          </div>
        )}
      </div>
    </>
  );
}

export default Home;
从'react'导入{useState,useffect};
从“../api/index”导入*作为api;
从“./头”导入头;
函数Home(){
const[user,setUser]=useState({
用户:{},
错误:null,
认证:假
});
useffect(()=>{
const fetchLoggedInUser=async()=>{
试一试{
const{data}=await api.loginsAccess();
setUser({authenticated:true,user:data.user});
}捕获(错误){
setUser({authenticated:false,错误:'Failed to authenticated user'});
}
};
fetchLoggedInUser();
}, []);
const handlenoauthenticated=()=>{
setUser(…user,{authenticated:false});
};
返回(
{!user.authenticated(
“欢迎”
) : (
您已成功登录
欢迎{user.user.firstName}
)}
);
}
导出默认主页;

setUser
获取一个对象,但您正在将一个对象(
user
)直接传播到其中,这应该是一个语法错误。你的意思是写
setUser({…user,authenticated:false})
?不过我编译客户端代码时没有出错。真奇怪。当我将代码固定为setUser({…user,authenticated:false})时,当我注销时,我的主页将继续使用登录消息重新呈现