highcharts 和 setChartOptions 中的 series.setData 在 ReactJS 中不起作用

series.setData in highcharts and setChartOptions is not working in ReactJS

提问人:Maulik Patel 提问时间:9/29/2023 最后编辑:Maulik Patel 更新时间:10/2/2023 访问量:57

问:

现在,正如我之前讨论过的散点图问题(HighCharts Scatter Plot with ReactJS 中的不一致数据点)是我们不能像 HighCharts 中的其他类型那样直接使用 setState 方法更新数据......

因此,我只需要使用 ref 更新数据(在散点图中)。

我的方案:

我从父组件中获取最小值和最大值,并在负责显示绘图的子组件的 XAxis 中传递相同的最小值和最大值。

问题:

=> 首次挂载组件时 - 初始化 chartOptions,其中系列数据为空(因为 maindata 为空)。现在,useEffect 运行并调用一个 API 来获取数据,我正在使用 ref 方法将该数据传递到 highcharts 中,如下所示......

useEffect(() => {
    const chart = chartRef.current.chart;
    if (chart) {
       chart.series[0].setData(mainData, true, true, false);
    }
}, [data]);

现在,当用户单击刷新图标 - 我将再次获取数据时,我可以使用上述方法更新系列数据。但是,为了在 XAxis 中设置最小值和最大值,我必须这样做(我需要再次设置它,因为我想将范围选择器放置在相同的范围内):

useEffect(() => {
   setChartOptions((prevState) => ({
        ...prevState,
        xAxis: [
          {
            ...prevState.xAxis[0],
            min: xMax.maxX - 50,
            max: xMax.maxX,
          },
        ],
}));
}, [data]);

重现问题的步骤:

=> 第一次绘图没有出现,因为数据是空的,而不是数据来自 API,这将使用 ref 进行设置,所以现在数据不是空的,我们可以看到绘图。

然后,setChartOptions 将运行,它只会更改 min 和 max,并保持其他内容与以前相同,因此数据将再次为 null,因为它默认为 null(mainData 第一次为 null)。

所以,情节消失了,只能看到空白的白屏。

期望:

=>我认为,我们可以像这样解决这个问题:

无论如何,我们可以设置一个机制来首先运行 setChartOptions,因此 min 和 max 被设置并且 than 和 than only,我们将使用 ref (chart.series[0].setData(mainData, true, true, false); ):

到目前为止,我尝试过:

=> 简单来说,我们可以直接通过set方法设置系列数据,如下所示:

setChartOptions((prevState) => ({
  ...prevState,
  series: [
    {
      ...prevState.series[0],
      data: mainData, // Update with the fetched data
    },
  ],
  xAxis: [
    {
      ...prevState.xAxis[0],
      min: xMax.maxX - 50,
      max: xMax.maxX,
    },
  ],
}));

但是,这不是散点图(Highcharts BUG)

但是,我无法弄清楚如何使用 ReactJS 解决这个问题。

实际上,我无法创建演示代码,因为数据来自 API,但您可以将此代码作为参考,其中我使用 ref 更新数据:

https://stackblitz.com/edit/react-9wsnd9?file=index.js

======================================================

更新:

嘿,感谢您的快速回复,但我仍然无法解决我的问题:

代码如下:https://stackblitz.com/edit/react-sgkrzf?file=index.js

解释:从父组件 - 我将 min={20} 和 max={40} 传递给子组件。

预期行为:默认情况下,Min 和 Max 应该应用(两者一起),但两者都不能一起工作(如果 min 应用比 max ain't 和如果 max 比 min 忽略)

我想最初分别应用最小值和最大值 20 和 40,然后用户可以更改范围选择器并在刷新时保留更改的值。

即=>刷新数据后,将范围选择器(20,40)更改为(34,75)应保留为(34,75)(我的意思是说调用API)

如何做到这一点?请修改上面的代码并帮助我完成相同的操作。

提前致谢。

javascript reactjs react-functional-component react-highcharts

评论


答:

1赞 ppotaczek 10/2/2023 #1

您可以在没有 prev 状态的情况下使用(旧选项不会被删除)。setChartOptions

useEffect(() => {
  setChartOptions(() => ({
    xAxis: [
      {
        min: xMax.maxX - 50,
        max: xMax.maxX
      }
    ]
  }));
}, [data]);

文档:https://github.com/highcharts/highcharts-react#optimal-way-to-update

或者直接在图表上操作(类似于 setData)并设置 xAxis 极值或更新最小值/最大值。

API 参考: https://api.highcharts.com/class-reference/Highcharts.Axis#setExtremes

评论

0赞 Maulik Patel 10/2/2023
您好,我在上述问题中包含了一个标记为 #update 的新部分,我在其中提供了我的代码和其他信息。您能看一下并提供您的意见吗?谢谢。
0赞 Maulik Patel 10/2/2023
代码链接:stackblitz.com/edit/react-sgkrzf?file=index.js
1赞 ppotaczek 10/4/2023
感谢您的详细说明!我们需要在第一次收到数据后进行调用。请查看此实时示例:stackblitz.com/edit/react-uhg6gb?file=Child.jschart.xAxis[0].setExtremes(min, max)
0赞 Maulik Patel 10/4/2023
谢谢你的解决方案,它奏效了。我不知道这个setExtremes方法,谢谢你让我知道同样的事情。将您的答案标记为已接受。