如何使Highcharts React在不更改数据的情况下重新绘制

jv2fixgn  于 2022-11-24  发布在  Highcharts
关注(0)|答案(2)|浏览(217)

我需要highcharts调整其宽度以适应父级的宽度。因此,如果我们改变父级的宽度而不改变数据,图表应该调整大小。但由于数据是相同的,所以不会发生这种情况。
如果我们调整浏览器屏幕的大小,它似乎可以工作,但这不是我们所需要的。

import React, { useState } from 'react';
import { render } from 'react-dom';
import HighchartsReact from 'highcharts-react-official';
import Highcharts from 'highcharts';

function getRandomIntInclusive(min, max) {
  min = Math.ceil(min);
  max = Math.floor(max);
  return Math.floor(Math.random() * (max - min + 1) + min);
}

const LineChart = () => {
  const [width, setWidth] = useState(null);
  const [chartOptions, setChartOptions] = useState({
    xAxis: {
      categories: ['A', 'B', 'C'],
    },
    series: [{ data: [1, 2, 3] }],
  });

  const handleWidth = () => {
    const w = getRandomIntInclusive(100, 500);
    setWidth(w);
  };

  return (
    <div style={{ width }}>
      <HighchartsReact highcharts={Highcharts} options={chartOptions} />
      <button onClick={handleWidth}>change container width</button>
    </div>
  );
};

render(<LineChart />, document.getElementById('root'));

下面是一个指向“不工作”示例的链接:https://stackblitz.com/edit/react-xhcmx4?file=index.js

ne5o7dgx

ne5o7dgx1#

来自Highcharts API:

回流([e])

将图表重排至其容器。根据预设,图表会在window.resize事件之后自动重排至其容器,如同chart.reflow选项。不过,div resize没有可靠的事件,因此如果在没有window resize事件的情况下调整容器大小,则必须明确呼叫此事件。
作为解决方案,在width更改后调用reflow方法。

useEffect(() => {
    const chart = chartComponent.current?.chart;

    if (chart) chart.reflow(false);
  }, [width]);

实时演示:https://stackblitz.com/edit/react-zydh8m?file=index.js
**API参考:**api.highcharts.com/class-reference/Highcharts.Chart#reflow

bvjxkvbb

bvjxkvbb2#

如果由于某种原因无法使用ppotaczek中的.reflow解决方案,则可以在调整容器div大小时向window对象发送resize事件。

setTimeout(() => window.dispatchEvent(new Event('resize')));

HighCharts侦听该事件,然后重新绘制自身。


相关问题