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

使用React与Flask搭建网站时数据无法加载的原因排查

React + Flask 前后端数据展示问题排查

尝试通过React的useEffect钩子从Flask后端获取数据并展示,参考示例代码后仅能获取对象引用,无法在控制台及页面显示数据。以下是相关代码:

App.js

import React, { useState, useEffect } from 'react'

function App() {
  const [data, setData] = useState([{}])

  useEffect(() => {
    fetch("/members").then(
      res => res.json()
    ).then(
      data => {
        setData(data)
        console.log(data)
      }
    )
  }, [])
  
  return (
    <div className="App">
      {(typeof data.members === 'undefined') ? (
        <p> Loading... </p>
      ):( 
        data.members.map((member, i) => (
          <p key={i}>{member}</p>
        ))
      )}
    </div>
  );
}

export default App;

server.py

from flask import Flask

app = Flask(__name__)

# Members API Route
@app.route('/members')
def members():
    return {"members": ["Mem1", "Mem2", "Mem3"]}

if __name__ == "__main__":
    app.run(debug=True)

问题原因及解决方案

1. 初始State类型不匹配

你将data初始化为[{}](数组类型),但Flask后端返回的是包含members数组的对象。类型不匹配会导致:

  • 初始渲染时data.members必然为undefined,显示Loading;
  • 数据更新后,State类型从数组突变为对象,可能引发React渲染逻辑异常。

修正方案:将初始State改为空对象,匹配后端返回结构:

const [data, setData] = useState({})

2. 跨域请求被拦截

React开发服务器默认运行在3000端口,Flask默认在5000端口,属于不同域名,浏览器会拦截跨域请求,导致数据无法正确接收(即便你以为获取到了对象引用,实际可能是错误信息或空对象)。

解决方式二选一:

  • 方式一:React配置代理
    在React项目的package.json中添加代理配置,自动转发请求到Flask服务器:
"proxy": "http://localhost:5000"
  • 方式二:Flask开启跨域支持
    安装flask-cors依赖:
pip install flask-cors

修改server.py添加跨域支持:

from flask import Flask
from flask_cors import CORS

app = Flask(__name__)
CORS(app)  # 允许所有跨域请求

@app.route('/members')
def members():
    return {"members": ["Mem1", "Mem2", "Mem3"]}

if __name__ == "__main__":
    app.run(debug=True)

3. 优化渲染判断逻辑

可以简化判断逻辑,更严谨地检测数据是否加载完成:

return (
  <div className="App">
    {!data.members ? (
      <p>Loading...</p>
    ) : (
      data.members.map((member, i) => (
        <p key={i}>{member}</p>
      ))
    )}
  </div>
);

为什么视频中可以正常运行?

视频示例大概率提前配置了跨域支持(代理或Flask跨域插件),且初始State的类型设置正确,匹配后端返回的数据结构,因此没有触发上述问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 21:40:42