Есть ли способ отображать один и тот же компонент ChartJS снова и снова на одной и той же странице?

#javascript #html #css #reactjs #chart.js

Вопрос:

Я работаю с ChartJS в react. У меня есть один компонент диаграммы ChartJS, который я хочу использовать более одного. Но когда страница отображается, отображается только первая диаграмма, а вторая диаграмма не отображается.

Ниже приведен компонент диаграммы, который я хочу использовать повторно.

 import React, { useEffect } from "react";
import Chart from "chart.js";


var waterFallChart;

export default function WaterFallChart(props) {

  useEffect(() => {
    if (waterFallChart) {
      waterFallChart.destroy();
    }
    const ctx = document.getElementsByClassName(props.chartClass);
    waterFallChart = new Chart(ctx, {
      type: "bar",
      data: {
        labels: ["sun","mon","tue","wed","thurs","fri"],
        datasets: [
          {
            label: 'Good',
            data: [10,20,30,40,50,60],
            backgroundColor: "#0058FF",
          },
          ]
      },
      options: {
      maintainAspectRatio: false,
      showAllTooltips: false,
      scales: {
        yAxes: [
          {
            ticks: {
              fontColor: "silver",
              fontSize: "12",
            },
            display: true,

            gridLines: {
              display: true,
              zeroLineColor: "white",
              zeroLineWidth: "1",
            },
          },
        ],
        xAxes: [
          {
            ticks: {
              fontColor: "silver",
              fontSize: "10",
            },
            gridLines: {
              display: true,
              color: "rgb(255,255,255, 0.2)",
              zeroLineColor: "white",
              zeroLineWidth: "2",
            },
          },
        ],
      },
      legend: {
        display: false,
      },
    },
    });
});
return (
  <React.Fragment>
    <div className="canvasParentDiv">
      <canvas className={props.chartClass} />
    </div>
  </React.Fragment>
);
}
 

И основной компонент, который использует компонент WaterFallChart.

 import React from 'react'
import WaterFallChart from './WaterFallChart'


function mainComponent() {
    return (
        <div>
            <WaterFallChart chartClass="chart1" />
            <WaterFallChart chartClass="chart2" />
            <WaterFallChart chartClass="chart2"/>
        </div>
    )
}

export default mainComponent
 

Поскольку у нас не может быть одного и того же идентификатора для холста, я ориентируюсь на холст с именем класса, но он отображает только одну диаграмму, а остальные две остаются скрытыми.

Комментарии:

1. Используйте ref : codesandbox.io/s/zen-mestorf-jkf2w?file=/src/WaterFallChart.js

2. @ChrisG Я смог отобразить все три графика, спасибо. Поскольку я буду обновлять данные на графике, и я должен использовать метод destroy (). Решение отлично работает без метода уничтожения, но отображает только один график при использовании метода уничтожения.

3. document.getElementsByClassName(props.chartClass) возвращает список узлов.