繁体   English   中英

React JS - 无限循环中的组件渲染

[英]React JS - Component rendering in infinite loop

当我使用 Bar 组件渲染屏幕时,它会在无限循环中渲染,甚至在我尝试传递数据之前。 我已经导入 react-chartjs-2 进行测试,效果很好,即只加载一次。 但另一个条形图似乎呈现,然后继续这样做,直到我的浏览器崩溃。

我认为这可能与我的组件是 const 的事实有关。

//import Bar from 'react-chartjs-2';   // <-- Renders once
import Bar from './../charts/Bar.js';  // <-- Renders in a loop

const MyComponent = () => {

    return (
        <div className="search">
            <Bar/>
        </div>
    );

}
export default MyComponent;

这是我正在使用的 Bar 组件。 它来自一个名为 Gogo-React 的 Themeforest 模板。

/* eslint-disable prefer-rest-params */
import React, { useEffect, useRef, useState } from 'react';
import { Chart } from 'chart.js';

import { barChartOptions } from './config';

const Bar = ({ data, shadow = false }) => {
  const chartContainer = useRef(null);
  const [, setChartInstance] = useState(null);

  useEffect(() => {
    if (chartContainer && chartContainer.current) {
      if (shadow) {
        Chart.defaults.global.datasets.barWithShadow =
          Chart.defaults.global.datasets.bar;
        Chart.defaults.barWithShadow = Chart.defaults.bar;
        Chart.controllers.barWithShadow = Chart.controllers.bar.extend({
          draw(ease) {
            Chart.controllers.bar.prototype.draw.call(this, ease);
            const {
              chart: { ctx },
            } = this;
            ctx.save();
            ctx.shadowColor = 'rgba(0,0,0,0.2)';
            ctx.shadowBlur = 7;
            ctx.shadowOffsetX = 5;
            ctx.shadowOffsetY = 7;
            ctx.responsive = true;
            Chart.controllers.bar.prototype.draw.apply(this, arguments);
            ctx.restore();
          },
        });
      }
      const context = chartContainer.current.getContext('2d');
      const newChartInstance = new Chart(context, {
        type: shadow ? 'barWithShadow' : 'bar',
        options: barChartOptions,
        data,
      });
      setChartInstance(newChartInstance);
    }
  }, [chartContainer, data, shadow]);

  return <canvas ref={chartContainer} />;
};

export default Bar;

useEffect 正在监听 chartContainer。 然后 useEffect 正在运行并更改 canvas 和 chartContainer 引用,然后触发 useEffect。 这将导致循环。

React 中useEffect()钩子在每次依赖项的状态改变时被调用,因为 chartContianer 状态被更新,你会重复调用useEffect()钩子。

更好的方法是更新图表中的数据而不是整个图表本身。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM