Recharts图表数据不显示?解决初始渲染时monthlyData为空的问题

发布时间 - 2025-12-30 00:00:00    点击率:

recharts图表在页面首次加载时不显示,仅在保存文件触发热重载后才出现,根本原因是状态更新异步性导致setmonthlydata(yearlydata[index])读取了过期的yearlydata(仍为初始空数组),应改为直接使用刚获取的data[index]。

这个问题本质是 React 状态更新的异步与不可变特性被误用所致。你在 getActivity 中调用 setYearlyData(data) 后,立即访问 yearlyData[index],但此时 yearlyData 仍是上一次渲染的值(如 [] 或 undefined),而非刚刚传入 setYearlyData 的新数据。React 不会同步修改 state 变量,而是将更新加入队列,并在下一次渲染时提供新值。

✅ 正确写法:使用当前获取的数据,而非依赖尚未更新的 state

const getActivity = async (index: number) => {
  try {
    const res = await api.get("/activity");
    const data = res?.data || [];
    setYearlyData(data);
    // ✅ 关键修正:用刚拿到的 data[index],而非 yearlyData[index]
    setMonthlyData(data[index] || []);
  } catch (error) {
    console.error("Failed to fetch activity data:", error);
    setMonthlyData([]);
  }
};

useEffect(() => {
  getActivity(0);
}, []);

⚠️ 额外建议:初始化 state 更健壮

避免因 yearlyData 初始值为 [] 导致静默失败(如 [][0] 得到 undefined),推荐显式初始化为 null 或带默认结构:

const [yearlyData, setYearlyData] = useState<{ name: string; user: number; guest: number }[]>([]);
const [monthlyData, setMonthlyData] = useState<{ name: string; user: number; guest: number }[]>([]);
// 或更严格地:
// const [yearlyData, setYearlyData] = useState(null as typeof initialData | null);

同时,在渲染前增加数据校验,防止 Recharts 因空/无效 data 报错或白屏:

{monthlyData.length > 0 ? (
  
    
      {/* 图表配置保持不变 */}
    
  
) : (
  
    加载中...
  
)}

? 调试技巧(快速定位类似问题)

在开发阶段,添加日志明确执行时序:

useEffect(() => {
  console.log('[Render] yearlyData:', yearlyData, 'monthlyData:', monthlyData);
}, [yearlyData, monthlyData]);

const getActivity = async (index) => {
  console.log('[Fetch Start]');
  const res = await api.get("/activity");
  const data = res?.data || [];
  console.log('[Fetched Data]:', data);
  setYearlyData(data);
  console.log('[After setYearlyData] yearlyData (still old):', yearlyData); // ❌ 这里永远不是新值
  setMonthlyData(data[index] || []); // ✅ 正确来源
};
? 提示:Vite + SWC 环境下无特殊影响,该问题是通用 React 状态逻辑问题,与构建工具无关。

总结:永远不要在 setState 后立即读取同名 state 变量——它不会反映本次更新。始终基于当前作用域内已知的有效值(如 API 响应 data)派生后续状态,才能确保首屏正确渲染。


# react  # vite  # 工具  # ai  # echarts  # 作用域  # NULL  # undefined  # 异步  # 而非  # 有效值  # 首次  # 你在  # 并在  # 这个问题  # 下一  # 仍是  # 问题是  # 报错 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 非常酷的网站设计制作软件,酷培ai教育官方网站?  Laravel如何发送系统通知?(Notification渠道示例)  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  如何构建满足综合性能需求的优质建站方案?  Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程  Laravel如何实现密码重置功能_Laravel密码找回与重置流程  EditPlus中的正则表达式实战(6)  免费视频制作网站,更新又快又好的免费电影网站?  Laravel如何实现多对多模型关联?(Eloquent教程)  晋江文学城电脑版官网 晋江文学城网页版直接进入  Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID  html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  海南网站制作公司有哪些,海口网是哪家的?  网站制作大概多少钱一个,做一个平台网站大概多少钱?  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  LinuxCD持续部署教程_自动发布与回滚机制  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】  Python并发异常传播_错误处理解析【教程】  Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布  JavaScript中的标签模板是什么_它如何扩展字符串功能  Laravel怎么连接多个数据库_Laravel多数据库连接配置  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  网站制作免费,什么网站能看正片电影?  Laravel如何处理CORS跨域请求?(配置示例)  深圳网站制作平台,深圳市做网站好的公司有哪些?  如何用IIS7快速搭建并优化网站站点?  Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践  Firefox Developer Edition开发者版本入口  Laravel如何创建自定义中间件?(Middleware代码示例)  uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址  油猴 教程,油猴搜脚本为什么会网页无法显示?  Laravel怎么实现微信登录_Laravel Socialite第三方登录集成  Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康  在Oracle关闭情况下如何修改spfile的参数  南京网站制作费用,南京远驱官方网站?  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  网页设计与网站制作内容,怎样注册网站?  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  Python企业级消息系统教程_KafkaRabbitMQ高并发应用  网站建设要注意的标准 促进网站用户好感度!  详解Oracle修改字段类型方法总结  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  如何在橙子建站上传落地页?操作指南详解  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】