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

React如何实现组件完全加载就绪后再渲染,避免先显示空内容?

问题1:切换分类出现短暂空组件的解决方案

你当前使用的是本地静态数据,不存在数据加载延迟,出现空白的核心原因是项目卡片里的图片资源加载需要时间,图片加载完成前对应区域空白,导致看起来像空组件。可以通过以下方式优化:

方案1:给单项目组件加图片加载状态,加载完成前显示占位/不显示

改造后的MyProjectsEachProject组件代码如下:

import React, { useState } from "react";
import "./myProjectsEachProject.css";

function MyProjectsEachProject({
  imagePath,
  imageName,
  name,
  desc,
  previewLink,
  githubLink,
}) {
  // 新增图片加载状态
  const [isImgLoaded, setIsImgLoaded] = useState(false);

  // 如果需要在加载完成前完全不显示组件,直接返回null即可
  // if (!isImgLoaded) return null;

  return (
    <div className="each-project-container">
      {/* 图片加载完成前显示加载占位,可自行替换为骨架屏、加载动画等 */}
      {!isImgLoaded && <div className="project-img-loading">加载中...</div>}
      <div 
        className="each-project-img-container"
        style={{ display: isImgLoaded ? 'block' : 'none' }}
      >
        <img 
          src={imagePath} 
          alt={imageName} 
          onLoad={() => setIsImgLoaded(true)}
        />
      </div>
      <p className="each-project--title">{name}</p>
      <p className="each-project--desc">{desc}</p>
      <div className="each-project--btns-container">
        <a href={previewLink}>Preview</a>
        <a href={githubLink}>GitHub repo</a>
      </div>
    </div>
  );
}

export default MyProjectsEachProject;

方案2:优化主组件筛选逻辑,减少不必要的遍历

原主组件遍历所有分类判断匹配的写法性能较差,可直接用find方法筛选出选中分类,优化后的代码如下:

import { useState } from "react";
import MyProjectsEachProject from "./MyProjectsEachProject/MyProjectsEachProject";
import categories from "./MyProjectsEachCategory/MyProjectsCategoriesData";

const MyProjects = () => {
  const [categorySelected, setCategorySelected] = useState(categories[0].title);
  // 直接定位到选中的分类,无需遍历所有分类
  const activeCategory = categories.find(item => item.title === categorySelected);
  const activeProjects = activeCategory ? activeCategory.projects : [];

  return (
    <div className="my-projects-container">
      <div className="projects-to-show-container">
        {activeProjects.map((eachProject) => (
          <MyProjectsEachProject
            key={eachProject.name}
            imagePath={eachProject.imagePath}
            imageName={eachProject.imageName}
            name={eachProject.name}
            relatedCategories={eachProject.relatedCategories}
            desc={eachProject.desc}
            previewLink={eachProject.previewLink}
            githubLink={eachProject.githubLink}
          />
        ))}
      </div>
    </div>
  );
};

export default MyProjects;
问题2:项目数据存储方式的选择

两种存储方式都是合理的,根据你的使用场景选择即可:

  • 如果你的项目数据不会频繁变动,不需要在不重新打包项目的前提下更新数据,直接用JS导出数组的方式完全可行。这种方式的优势是数据会直接被打包进构建产物,不需要额外发起网络请求,加载速度更快,也不存在请求失败的风险。
  • 如果你后续需要支持非开发人员更新项目数据,或者不想每次修改项目数据都重新打包,可以把数据存在public目录下的JSON文件里,通过fetch请求获取;如果后续要对接后台管理系统动态更新数据,再改成调用后端接口即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 02:48:03