You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React结合Axios访问/dashboard时不等接口响应直接跳转如何解决?

解决方案

核心问题

  • 你将axios请求直接写在组件根作用域,组件每次渲染都会重复触发请求,且React组件渲染逻辑是同步的,不会等待异步请求返回再执行return语句
  • loggedin初始值为undefined,第一次渲染时就会触发<Redirect />直接跳转登录页,等接口返回更新state时页面已经跳转完成,状态更新不会生效

修复方案

  1. 新增loading状态,接口请求未返回时渲染加载占位,不执行跳转逻辑
  2. 把axios请求包裹在useEffect钩子中,仅在组件首次挂载时触发一次,避免重复调用
  3. 给loggedin设置明确的初始布尔值false,避免类型歧义

修正后代码如下:

import axios from 'axios';
import React, { useEffect, useState } from 'react';
import { Redirect } from 'react-router';
import OverallCondition from "./dashOverall";
import Toolbar from "./dashToolbar";

export default function Dashboard(){
    const [loggedin, setLoggedin] = useState(false)
    const [loading, setLoading] = useState(true)

    useEffect(() => {
        axios.get('/loggedin')
            .then(response => {
                setLoggedin(response.data)
            })
            .catch(err => console.error(err))
            .finally(() => {
                setLoading(false)
            })
    }, [])

    if(loading) {
        return <section className='dashboard'><p>加载中...</p></section>
    }

    return <section className='dashboard'>
            {loggedin ? <div>
                <Toolbar/>
                <OverallCondition/>
            </div> : <Redirect to='/login'/>}
    </section>
}

逻辑说明

组件挂载后触发登录状态校验,请求过程中显示加载提示,请求结束后:如果loggedin为true则渲染仪表盘内容,为false则跳转到登录页。另外将原状态更新函数名从check改为setLoggedin,符合React useState的通用命名规范,可读性更好。

内容的提问来源于stack exchange,提问作者unes savari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 08:27:00