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

React中成功获取API数据却无法setState,页面持续显示加载状态的问题排查

嘿,我一眼就看到你代码里的两个小问题啦,咱们一个个说:

第一个问题:fetch的then链传递数据出错

你在fetch的第二个then里写了console.log(data),但console.log()这个函数本身是没有返回值的(返回undefined)。这就导致下一个then里的data变成了undefined,所以this.setState({cake_object: data})其实是把cake_object设成了undefined,你的组件状态里自然永远没有正确的蛋糕数据,页面就一直停在“Loading this cake”啦。

解决办法很简单,把console.log和setState放在同一个then回调里,或者让console.log的回调返回data:

// 方案一:合并到同一个then里
.then(data => {
  console.log(data);
  this.setState({cake_object: data});
})

// 方案二:返回data给下一个then
.then(data => {
  console.log(data);
  return data;
})
.then(data => this.setState({cake_object: data}))

第二个问题:渲染时错误访问数据

你的_renderEachCake方法里用了this.cake_object,但实际上你把数据存在了组件的state里,应该用this.state.cake_object才对!就算前面的setState对了,这里也拿不到数据,所以这个也得改。

我把完整的修正代码给你:

import React, { Component } from 'react';
import EachCake from './EachCake';

class Cake extends Component {
  constructor(props){
    super(props);
    this.state = { }
  }

  componentDidMount() {
    this._fetchApiEachCake();
  }

  _renderEachCake = () => {
    // 解构state里的cake_object,代码更简洁
    const { cake_object } = this.state;
    return <EachCake 
      image={cake_object.image} 
      source={cake_object.source} 
      body={cake_object.body} 
    />
  }

  _fetchApiEachCake = () => {
    return fetch("http://127.0.0.1:8000/api/cake/3")
      .then((response) => response.json())
      .then(data => {
        console.log(data);
        this.setState({cake_object : data});
      })
      .catch((err) => console.log(err)) // 建议加上catch,方便排查请求错误
  }

  render() {
    return (
      <div>
        {this.state.cake_object ? this._renderEachCake() : "Loading this cake"}
      </div>
    )
  }
}

export default Cake

另外提醒你一下,记得把catch加上哦,万一API请求出错了,你也能在控制台看到错误信息,方便调试~

内容的提问来源于stack exchange,提问作者Ryan Oh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 06:22:39