因此,这更像是一个javascript问题,而不是一个reactjs问题.我正在reactjs中创建受保护的路由.在这里,我获取"/checkauth"get请求来判断身份验证,它会正确地将响应返回给我.然而,问题是,由于它是一个异步函数,返回该值需要时间,因此我的return语句执行得更早.

const [auth, setAuth] = useState();

const checkAuthentication = async ()=>{
    const res = await fetch('/checkauth', {
        method : "GET",
        credentials: "include", 
        headers: {
            'Accept': 'application/json',
            'Content-Type': 'application/json',
        }
    });
    const data = await res.json();
    return res.status===200 ? (data.isAuthenticated) : (false) ;
}

useEffect(async ()=>{
    const data = await checkAuthentication();
    setAuth(data)
}, []);

return auth ? <Outlet /> : <Navigate to='/signin' />;

在这里,auth总是未定义的,因此它总是导航到签名.

推荐答案

使用三种状态.

const [auth, setAuth] = useState("loading");

...

setAuth(data ? "auth" : "not-auth");

...

if (auth === "loading")
    return <Loading />
else if (auth === "not-auth")
    return <Navigate to='/signin' />
else 
    return <Outlet />

Javascript相关问答推荐

仅圆角的甜甜圈图表

zoom svg以适应圆

在Angular中将样式应用于innerHTML

togglePopover()不打开但不关闭原生HTML popover'

我可以从React中的出口从主布局调用一个处理程序函数吗?

如何在Obsidian dataview中创建进度条

给定一个凸多边形作为一组边,如何根据到最近边的距离填充里面的区域

并不是所有的iframe都被更换

变量的值在Reaction组件中的Try-Catch语句之外丢失

我创建了一个创建对象的函数,我希望从该函数创建的对象具有唯一的键.我怎么能做到这一点?

如何在Angular17 APP中全局设置AXIOS

如何将innerHTML字符串修剪为其中的特定元素?

如何将数据块添加到d3力有向图中?

使用auth.js保护API路由的Next.JS,FETCH()不起作用

如何在JAVASCRIPT中临时删除eventListener?

Vaadin定制组件-保持对javascrip变量的访问

如果没有页面重新加载Angular ,innerHTML属性绑定不会更新

我的NavLink活动类在REACT-ROUTER-V6中出现问题

如何在Web项目中同步语音合成和文本 colored颜色 更改

在执行console.log(new X())时记录一个字符串