React + chartjs应用程序在添加图表时速度变慢

xvw2m8pv  于 2022-11-06  发布在  Chart.js
关注(0)|答案(1)|浏览(162)

对reactjs来说非常新。我有一个reactjs应用程序,用react-chartjs-2显示一些图表。我通过api调用为图表提供数据。如果图表多达三个,应用程序运行得很快。但是,当我添加图表时,应用程序运行得越来越慢。变慢的是图表的绘制。我的数据从api快速获得,但图表最初什么也不显示,几秒钟后显示出来。此外,我尝试了另一个react图表库(nivojs)和行为是一样的。我添加的图表越多,得到的速度就越慢。所以这让我认为这是一个React问题(我的意思是从我这边来看实现不好),因为我没有任何经验。下面是我的动态组件的代码,用chartjs呈现图表。我已经禁用了React中的严格模式,从性能的Angular 看没有任何变化。为了显示所有这些图表,我使用滑动条作为滑块,但不会导致任何性能问题,因为无论是在滑动器内部还是外部渲染,性能都保持不变。x1c 0d1x

import { useState, useEffect, Fragment } from "react";
import "./BarChart.css";
import {
  Chart as ChartJS,
  CategoryScale,
  LinearScale,
  PointElement,
  LineElement,
  Title,
  Tooltip,
  Legend,
} from "chart.js";
import { Bar } from "react-chartjs-2";
import { Dna } from "react-loader-spinner";

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

export const options = {
  responsive: true,
  animation: false,
};

function BarChart(props) {
  const [chartData, setChartData] = useState({});
  const [xAxis, setXAxis] = useState([]);
  const [yAxis, setYAxis] = useState([]);
  const [slideTitle, setSlideTitle] = useState("");
  const [htmlText, setHtmlText] = useState("");
  const [paragraphTitle, setParagraphTitle] = useState("");
  const [loaded, setLoaded] = useState(false);

  useEffect(
    function () {
      fetch(`this is a call to my api`)
        .then(function (response) {
          return response.json();
        })
        .then(function (data) {
          setXAxis(data.data[props.slideData.xAxis]);
          setYAxis(data.data[props.slideData.yAxis]);
          setChartData({
            labels: xAxis,
            datasets: [
              {
                label: "Users Gained",
                data: yAxis,
                backgroundColor: ["red"],
                borderColor: "red",
              },
            ],
          });
          setSlideTitle(data.data.slide_title);
          setHtmlText(data.data.html_text);
          setParagraphTitle(data.data.paragraph_title);
          setLoaded(true);
        });
    },
    [loaded]
  );

  if (!loaded) {
    return (
      <div style={{ textAlign: "center" }}>
        <Dna
          visible={true}
          height="20vh"
          width="20vw"
          ariaLabel="dna-loading"
          wrapperStyle={{}}
          wrapperClass="dna-wrapper"
        />
      </div>
    );
  } else {
    return (
      <Fragment>
        <div className="slideTitle w-100">
          <h1 className="mt-5">{slideTitle}</h1>
          <div className="pseudoBorder"></div>
        </div>
        <div className=" d-flex justify-content-between align-items-center">
          <div className="chart col-10">
            <Bar data={chartData} options={options} />
          </div>
          <div className="text-for-chart col-2 p-4">
            <p className="paragraphTitle text-danger ">{paragraphTitle}</p>
            <div
              className="htmlText"
              dangerouslySetInnerHTML={{ __html: htmlText }}
            />
          </div>
        </div>
      </Fragment>
    );
  }
}

export default BarChart;
wd2eg0qa

wd2eg0qa1#

我改变了我管理state和useEffect的方式,现在绘图没有问题了。正如文档中所说,如果多个状态一起改变,我就合并它们合并到一个对象中。我改变的是:如前所述,我将状态更改为一个对象:

const [data, setData] = useState({
    chartData: {
      labels: [],
      datasets: [
        {
          label: "Users Gained",
          data: [],
          backgroundColor: ["red"],
          borderColor: "red",
        },
      ],
    },
    slideData: {
      slideTitle: "",
      htmlText: "",
      paragraphTitle: "",
    },
  });

并且我将useEffect更改为仅在组件第一次挂载时运行:

useEffect(function () {
    fetch(`this is a call to my api`)
      .then(function (response) {
        return response.json();
      })
      .then(function (data) {
        setData({
          chartData: {
            labels: data.data[props.slideData.xAxis],
            datasets: [
              {
                label: "Users Gained",
                data: data.data[props.slideData.yAxis],
                backgroundColor: ["red"],
                borderColor: "red",
              },
            ],
          },
          slideData: {
            slideTitle: data.data.slide_title,
            htmlText: data.data.html_text,
            paragraphTitle: data.data.paragraph_title,
          },
        });
        setLoading(false);
      });
  }, []);

相关问题