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

React页面空白但控制台有数据无报错问题求助

React排行榜页面空白问题排查与修复

问题描述

开发网站排行榜功能,通过Spring Boot API获取数据传递到React前端。执行npm start后页面显示空白,开发者工具无报错,控制台能看到数据,页面出现滚动条,推测数据已传递但未渲染,后端运行正常,问题出在前端。

相关代码

Board.js

import React, { useState, useEffect } from 'react';
import axios from 'axios';
import Profiles from './profiles';

export default function Board() {
  
  const [Leaderboard, setLeaderboard] = useState([]);

useEffect(() => {
  loadLeaderboard();
}, []);

const loadLeaderboard = async () => {
  const result = await axios.get("http://localhost:8080/Leaderboard");
  setLeaderboard(result.data);
};


  console.log(Leaderboard);


  const sortedLeaderboard = Leaderboard.sort((a, b) => b.score - a.score);
  
  return (
    <div className="board">
        <h1 className='leaderboard'>Leaderboard</h1>
        <Profiles   Leaderboard={sortedLeaderboard}></Profiles>
    </div>
  )
}

Profiles.js

import React from "react";
export default function Profiles({ Leaderboard }) {
  return (
    <div id="profile">
      {item(Leaderboard)}
    </div>
  );
}
function item(Leaderboard) {
  return (
    <>
      {Leaderboard.map((value, index) => (
        <div className="flex" key={index}>
          <div className="item">
            <img src={value.Image} alt="" />

            <div className="info">
              <h3 className="name text-dark">{value.Name}</h3>
              <span>{value.location}</span>
            </div>
          </div>
          <div className="item">
            <span>{value.Score}</span>
          </div>
        </div>
      ))}
    </>
  );
}

Index.js

import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';


const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);

// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint.

Package.json

{
  "name": "leaderboard",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@testing-library/jest-dom": "^5.16.5",
    "@testing-library/react": "^13.4.0",
    "@testing-library/user-event": "^13.5.0",
    "axios": "^1.3.4",
    "browserify": "^17.0.0",
    "crypto": "^1.0.1",
    "crypto-browserify": "^3.12.0",
    "http-proxy-middleware": "^2.0.6",
    "mysql": "^2.18.1",
    "mysql2": "^3.2.0",
    "process": "^0.11.10",
    "react": "^18.2.0",
    "react-dom": "^18.2.0",
    "react-scripts": "^5.0.1",
    "timers-browserify": "^2.0.12",
    "util": "^0.12.5",
    "web-vitals": "^2.1.4"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": [
      "react-app",
      "react-app/jest"
    ]
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  },
  "devDependencies": {
    "browserify-zlib": "^0.2.0",
    "net-browserify": "^0.2.4",
    "stream-browserify": "^3.0.0",
    "tls-browserify": "^0.2.2"
  }
}

问题排查与修复方案

1. 字段大小写不匹配

排序逻辑中使用b.score - a.score(小写s),但渲染时用value.Score(大写S),后端返回的字段名必须和代码中完全一致。如果后端返回score,则渲染时改为value.score;如果返回Score,排序时改为b.Score - a.Score。同时检查value.Name、value.location、value.Image的字段大小写,确保和后端返回结构对齐。

2. 避免直接修改原状态数组

Array.sort()会直接修改原数组,违反React状态不可变原则,可能导致渲染异常。修改排序逻辑:

// 复制原数组后再排序,避免修改原状态
const sortedLeaderboard = [...Leaderboard].sort((a, b) => b.score - a.score);

3. 检查样式是否导致元素不可见

查看index.css中相关类的样式:

  • 确保.flex设置了display: flex,否则布局错乱;
  • 检查文本颜色是否与背景色一致,导致内容不可见;
  • 确认元素有足够的内边距/外边距,避免内容被挤压或隐藏。

4. 增加数据校验(可选)

在渲染前校验数据结构,避免因字段缺失导致空渲染:

function item(Leaderboard) {
  return (
    <>
      {Leaderboard.map((value, index) => (
        <div className="flex" key={index}>
          <div className="item">
            <img src={value?.Image || ''} alt="用户头像" />
            <div className="info">
              <h3 className="name text-dark">{value?.Name || '匿名用户'}</h3>
              <span>{value?.location || '未知地区'}</span>
            </div>
          </div>
          <div className="item">
            <span>{value?.score ?? 0}</span>
          </div>
        </div>
      ))}
    </>
  );
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 04:14:59