开发者问题收集

未捕获的类型错误:无法读取 null 的属性(读取“标签”)

2022-07-22
990

我正在尝试使用 chartjs 构建一个 LineChart,但是遇到了一些错误,我无法判断错误来源,数据已根据需要从服务器传输,并且(根据日期和 coinValue)拆分得很好。 知道问题是什么吗?

错误如下:

errors

这是我的代码:

import { Link } from "react-router-dom";
import { Line } from "react-chartjs-2";
import {Chart as chartjs, Title, Tooltip, LineElement, Legend, CategoryScale, LinearScale, PointElement} from "chart.js";

chartjs.register(
  Title, Tooltip, LineElement, Legend, CategoryScale, LinearScale, PointElement
)

function BitCoin() {
  const [data, setData] = React.useState(null);
  const [dates, setDates] = React.useState(null);
  const [coinValue, setCoinValue] = React.useState(null);
  const [chartData, setChartData] = useState(null);


  React.useEffect(() => {
    fetch("http://localhost:3001/bitcoin")
      .then((res) => res.json())
      .then((data) => {
        const twoDimensionArr = data.message;
        setData(twoDimensionArr);
        setDates(twoDimensionArr.map(item => item[0]));
        setCoinValue(twoDimensionArr.map(item => item[1]));
        setChartData({
          labels: twoDimensionArr.map(item => item[0]),
          datasets: [{
            label: "value of BTC in ILS",
            data: twoDimensionArr.map(item => item[1]),
            backgroundColor: 'gold'
          }]
        })
      })
  }, []);

  return (
    <div style={{textAlign:"center", fontFamily:"Comic Sans MC", fontSize:"100"}}>
      THIS IS THE BitCoin PAGE

      <nav>
        <Link to="/"> Home </Link>
      </nav>

      <nav>
        <Link to="/coins"> Coins </Link>
      </nav>

      <Line
      data = {chartData}
      />

    </div>
  )
}

export default BitCoin;
2个回答

这是因为您将 null 传递给了 Line 组件。

您需要使用空状态初始化数据,或者有条件地渲染 Line。

初始状态:

const [chartData, setChartData] = useState({
    labels: [],
    datasets: [{
        data: []
    }]
});

有条件渲染:

{chartData !== null && <Line data={chartData}/>}
Jacco Berg
2022-07-22

不熟悉该图表库,但我猜测它在 API 调用返回异步数据之前出错了。我会尝试创建有效的未初始化数据以在初始渲染时提供给 Line 组件,或者干脆阻止图表加载,直到数据返回。您可以使用以下方法检查这是否是您的问题:

{chartData && <Line
      data = {chartData}
      />
}
Chris B.
2022-07-22