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

React-TypeScript中react-chartjs-2传参后出现labels读取错误

React-TypeScript中react-chartjs-2折线图报错"Cannot read properties of undefined (reading 'labels')"的解决

问题场景

  • 在React-TypeScript项目中使用react-chartjs-2和chart.js实现折线图
  • 已完成配置:类型声明文件、接收options和data的LineGraph子组件、负责传参的SolvedGraph父组件
  • 运行时触发错误:Cannot read properties of undefined (reading 'labels')
  • 但如果直接在LineGraph组件内部声明options和data,图表能正常渲染

问题根因

组件初始化顺序出错,父组件在数据集还未完成初始化时就传递给了子组件,导致LineGraph接收到的data为undefined。当组件尝试读取data.labels时,自然触发了属性读取错误。

解决方案

1. 子组件添加空值校验

在LineGraph中先判断data及data.labels是否存在,再渲染图表,避免读取未定义的属性:

import { Line } from 'react-chartjs-2';
import { ChartData, ChartOptions } from 'chart.js';

type LineGraphProps = {
  data: ChartData<'line'>;
  options: ChartOptions<'line'>;
};

const LineGraph = ({ data, options }: LineGraphProps) => {
  // 空值校验,返回加载占位符
  if (!data || !data.labels?.length) {
    return <div>图表加载中...</div>;
  }

  return <Line data={data} options={options} />;
};

export default LineGraph;

2. 父组件确保数据就绪后再渲染子组件

在SolvedGraph中,等待数据初始化(比如异步接口请求、状态赋值)完成后,再渲染LineGraph:

import LineGraph from './LineGraph';
import { useState, useEffect } from 'react';
import { ChartData, ChartOptions } from 'chart.js';

const SolvedGraph = () => {
  const [chartData, setChartData] = useState<ChartData<'line'> | null>(null);
  const [chartOptions] = useState<ChartOptions<'line'>>({
    responsive: true,
    scales: {
      y: { beginAtZero: true }
    }
  });

  useEffect(() => {
    // 模拟异步数据获取或初始化逻辑
    const initChartData = async () => {
      // 替换为实际的数据获取逻辑
      const fetchedData = {
        labels: ['周一', '周二', '周三', '周四', '周五'],
        datasets: [{
          label: '每日解决问题数',
          data: [8, 12, 5, 15, 10],
          borderColor: '#2196F3',
          backgroundColor: 'rgba(33, 150, 243, 0.1)',
          tension: 0.2
        }]
      };
      setChartData(fetchedData);
    };

    initChartData();
  }, []);

  // 仅当chartData存在时渲染子组件
  return chartData ? (
    <LineGraph data={chartData} options={chartOptions} />
  ) : (
    <div>加载中...</div>
  );
};

export default SolvedGraph;

3. 给props设置默认值

在子组件中为data和options设置默认空值,避免传入undefined导致报错:

const LineGraph = ({ 
  data = { labels: [], datasets: [] }, 
  options = { responsive: true } 
}: LineGraphProps) => {
  return <Line data={data} options={options} />;
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 23:25:09