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

使用Ionic React 6与ChartJS渲染图表时Canvas重复使用错误求助

解决Ionic React中Chart.js Canvas重复使用错误

这个错误是因为Chart.js创建的图表实例未被正确销毁,当组件重新渲染时,同一个Canvas元素被多个图表实例占用导致冲突。以下是几种可行的解决方法:

方法一:用useRef保存并销毁图表实例

通过React的useRef钩子保存图表实例,在组件卸载时手动销毁旧实例,避免重复占用Canvas:

import { Bar } from "react-chartjs-2";
import { useEffect, useRef } from "react";

const Graph: React.FC = (props) => {
  const chartRef = useRef<any>(null);
  const data = {
    labels: ["Billable", "Non Billable"],
    datasets: [
      {
        label: "Billable Vs. Non Billable",
        backgroundColor: ["#36a2eb", "rgba(255,99,132,0.2)"],
        borderColor: "rgba(255,99,132,1)",
        borderWidth: 1,
        hoverBackgroundColor: "rgba(255,99,132,0.4)",
        hoverBorderColor: "rgba(255,99,132,1)",
        data: [65, 59],
      },
    ],
  };

  useEffect(() => {
    // 组件卸载时销毁图表实例
    return () => {
      if (chartRef.current) {
        chartRef.current.destroy();
      }
    };
  }, []);

  return (
    <div>
      <h2>bar example</h2>
      <Bar
        ref={chartRef}
        data={data}
        width={100}
        height={50}
        options={{ maintainAspectRatio: false }}
      />
    </div>
  );
};

export default Graph;

方法二:给图表组件指定唯一ID

给Bar组件添加固定的id属性,让Chart.js基于这个ID管理实例,避免自动生成的ID冲突:

// 其他代码保持不变
<Bar
  id="billable-nonbillable-chart"
  data={data}
  width={100}
  height={50}
  options={{ maintainAspectRatio: false }}
/>

方法三:配置自动销毁实例(版本兼容前提下)

在Chart.js的配置中启用destroyOnDestroy,确保组件卸载时自动销毁实例(需确认你的react-chartjs-2版本支持该配置):

// 在options中添加配置项
options={{ 
  maintainAspectRatio: false,
  destroyOnDestroy: true
}}

优先推荐方法一,它能在组件整个生命周期内正确管理图表实例,彻底避免Canvas复用冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 15:25:20