Highcharts 不会在值更改时重新加载或重新呈现图表

Highcharts doesnot reload or re-render chart on value change

我在 highcharts 中创建了圆环图,其中数据值在下拉列表的 select 上发生变化。

Codesandbox code

在 select 下拉菜单中,数据发生变化,但图表不会重新呈现,更新后的数据也不会显示在图表中。任何数据的图表都保持不变。

我尝试包括 oneToOne={true}。但这也无济于事。

有一些类似的问题,但对我的情况没有帮助。

如果有人有任何想法或需要任何进一步的信息,请告诉我。

一个解决方案是使用useEffect hook 并传递detailsin useEffect 依赖项,这样每次 details 都会改变他的状态 useEffect 将被触发并且你的 dataValues 将被更新:

import React, { useState, useEffect } from "react";
import { render } from "react-dom";
// Import Highcharts
import Highcharts from "highcharts/highstock";
import PieChart from "highcharts-react-official";

const App = () => {
  const [details, setDetails] = useState("sup");
  let dataValue = [
    ["Firefox", 45.0],
    ["IE", 26.8],
    ["Chrome", 12.8],
    ["Safari", 8.5],
    ["Opera", 6.2],
    ["Others", 0.7]
  ]; //pass default "sup" to datavalue
  const [chartOptions, setChartOptions] = useState({
    chart: {
      type: "pie"
    },
    title: {
      text: ""
    },
    plotOptions: {
      pie: {
        size: "50%",
        allowPointSelect: true,
        cursor: "pointer",
        depth: 35,
        innerSize: 100,
        dataLabels: {
          enabled: false
        },
        showInLegend: true
      }
    },
    series: [
      {
        type: "pie",
        name: "Browser share",
        data: dataValue
      }
    ]
  });
  useEffect(() => {
    console.log(details);
    if (details === "sup") {
      dataValue = [
        ["Firefox", 45.0],
        ["IE", 26.8],
        ["Chrome", 12.8],
        ["Safari", 8.5],
        ["Opera", 6.2],
        ["Others", 0.7]
      ];
    } else if (details === "hola") {
      dataValue = [
        ["Apple", 35],
        ["Guava", 40],
        ["Grapes", 22.5]
      ];
    }
    setChartOptions((prev) => {
      return {
        ...prev,
        series: [
          {
            type: "pie",
            name: "Browser share",
            data: dataValue
          }
        ]
      };
    });
  }, [details]);

  async function newfetchVendor(e) {
    if (!!e) {
      setDetails(e.target.value);
    }
  }

  return (
    <div>
      <select onChange={newfetchVendor}>
        <option value="sup">sup</option>
        <option value="hola">hola</option>
      </select>
      <PieChart
        highcharts={Highcharts}
        options={chartOptions}
        oneToOne={true}
      />
    </div>
  );
};

render(<App />, document.getElementById("root"));