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组件复用【手册】
上一篇: 播放网站怎么制作视频,电影网址怎么获取?
上一篇: 播放网站怎么制作视频,电影网址怎么获取?


[yearlyData, setYearlyData] = useState(null as typeof initialData | null);