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

Electron+React+Flask项目页面元素无法自动更新数据的技术咨询

解决新数据到达时内容项不自动刷新的问题

核心问题定位

你的React组件误用了类组件的状态访问方式(this.state.data[0]),但当前是函数组件,通过useState定义的状态需直接用变量data访问。这导致状态更新后,页面渲染内容未同步变化。

具体修正步骤

  1. 修正状态引用
    将渲染部分的{this.state.data[0]}替换为{data[0] || '--'},添加默认值避免数组为空时出现undefined。

  2. 添加请求错误处理
    在fetchData函数中加入错误捕获,防止请求失败导致组件卡住。

  3. (可选)解决跨域问题
    Electron加载本地页面时origin为file://,Flask默认会拒绝跨域请求,需安装并启用flask-cors。

修正后的代码

App.js

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

export default function App() {
  const [data, setData] = useState([]);

  useEffect(() => {
    const fetchData = async () => {
      try {
        const response = await fetch("http://localhost:5000/api/data");
        if (!response.ok) throw new Error('请求失败');
        const newData = await response.json();
        setData(newData);
      } catch (err) {
        console.error('数据获取失败:', err);
      }
    };
    // 每1秒拉取一次数据
    const intervalId = setInterval(fetchData, 1000);
    // 组件卸载时清理定时器
    return () => clearInterval(intervalId);
  }, []);

  return (
    <div>
      <div className="home">
        <div className="template-1" id="temp1">
          <div className="panel-1">
            <div className="panel-header">
              <h1>Panel 1</h1>
              <i className='bx bx-cog modal-trigger-panel'></i>
            </div>
            <div className="panel-body">
              <div className="sec-5 modal-trigger-data" id="hs-sec-5">
                <span className="h1" id="h1-fs-s5">{data[0] || '--'}</span>
                <h2>TWIST</h2>
                <h3>s5</h3>
              </div>
              <div className="sec-4 modal-trigger-data" id="hs-sec-4">
                <h1>{data[1] || '--'}</h1>
                <h2>TWIST</h2>
                <h3>s4</h3>
              </div>
              <div className="sec-3 modal-trigger-data" id="hs-sec-3">
                <h1>{data[2] || '--'}</h1>
                <h2>TWIST</h2>
                <h3>s3</h3>
              </div>
              <div className="sec-2 modal-trigger-data" id="hs-sec-2">
                <h1>{data[3] || '--'}</h1>
                <h2>TWIST</h2>
                <h3>s2</h3>
              </div>
              <div className="sec-1 modal-trigger-data" id="hs-sec-1">
                <h1>{data[4] || '--'}</h1>
                <h2>TWIST</h2>
                <h3>s1</h3>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  )
}

Python(添加跨域支持)

先安装依赖:

pip install flask-cors

修改Flask代码:

from flask import Flask, jsonify
from flask_cors import CORS
import random

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

@app.route('/api/data')
def get_data():
  data = [random.randint(0, 100) for _ in range(10)]
  return jsonify(data)

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

额外说明

  • 函数组件中useState定义的状态是直接可用的变量,无需通过this.state访问。
  • 错误处理能提升组件稳定性,避免因网络或后端故障导致页面异常。
  • 启用flask-cors后,Electron本地页面可正常请求Flask接口,不会触发跨域拦截。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 22:40:55