React Highcharts 多次触发 setExtremes 事件
React Highcharts firing setExtremes event multiple times
我在使用 Hooks 的应用程序中使用 Highcharts React 包装器,当我的图表加载或缩放时,它会多次触发 setExtremes 和 setAfterExtremes。我已经浏览过类似的问题,但它们与不同的问题有关。
我已将代码减少到最少的设置,页面不刷新,数据只被解析一次并添加到图表一次,动画被禁用并且它仍然持续触发两个事件 7 次:
* 初始种群
* 缩放
版本:react 16.9,highcharts 7.2,highcharts-react-official 2.2.2
图表
<HighchartsReact
ref={chart1}
allowChartUpdate
highcharts={Highcharts}
options={OPTIONS1}
/>
图表选项:
const [series1, setSeries1] = useState([]);
const OPTIONS1 = {
chart: {
type: 'spline',
zoomType: 'x',
animation: false
},
title: {
text: ''
},
xAxis: {
events: {
setExtremes: () => {
console.log('EVENT setExtremes');
},
afterSetExtremes: () => {
console.log('EVENT sfterSetExtremes');
}
},
},
plotOptions: {
series: {
animation: false
}
},
series: series1
};
数据人口:
useEffect(() => {
if (data1) {
const a = [];
_.each(data1.labels, (sLabel) => {
a.push({
name: sLabel,
data: [],
})
});
... POPULATES DATA ARRAYS...
setSeries1(a);
}
}, [data1]);
你的 useEffect 被多次触发可能是因为你正在检查 data1 而 data1 正在改变。您是否尝试过在 useEffect 中放置一个空数组并查看它是否多次触发?
如果它只触发一次,那么问题是你的 useEffect 正在检查一个不断变化的值
如果它仍然触发多次,那么有一些东西触发了你的 useEffect
问题比较老了我也遇到过同样的情况。解决方案是将图表选项移动到状态变量。那么这个事件就不会触发多次了。
图书馆文档中提到了它。 https://github.com/highcharts/highcharts-react -- 见“最佳更新方式”
import { render } from 'react-dom';
import HighchartsReact from 'highcharts-react-official';
import Highcharts from 'highcharts';
const LineChart = () => {
const [hoverData, setHoverData] = useState(null);
// options in the state
const [chartOptions, setChartOptions] = useState({
xAxis: {
categories: ['A', 'B', 'C'],
events: {
afterSetExtremes: afterSetExtremes,
},
},
series: [
{ data: [1, 2, 3] }
],
});
function afterSetExtremes(e: Highcharts.AxisSetExtremesEventObject) {
handleDateRangeChange(e);
}
return (
<div>
<HighchartsReact
highcharts={Highcharts}
options={chartOptions}
/>
</div>
)
}
render(<LineChart />, document.getElementById('root'));```
在 useEffect() 中设置状态后,我遇到了同样的问题。
我的问题是我对整个选项进行了 (lodash) 深度复制。
这也每次都会创建一个新事件。
// Create options with afterSetExtremes() event
const optionsStart: Highcharts.Options = {
...
xAxis: {
events: {
afterSetExtremes: afterSetExtremesFunc,
}
},
....
// Save in state
const [chartOptions, setChartOptions] = useState(optionsStart);
// On Prop Change I update Series
// This update deepcopy whole Options. This adds one Event Every time
React.useEffect(() => {
var optionsDeepCopy = _.cloneDeep(chartOptions);
optionsDeepCopy.series?.push({
// ... Add series data
});
setChartOptions(optionsDeepCopy);
}, [xxx]);
解决方法是只更新系列。不是整个选项。
React.useEffect(() => {
var optionsDeepCopy = _.cloneDeep(chartOptions);
optionsDeepCopy.series?.push({
// ... Add series data
});
const optionsSeries: Highcharts.Options = { series: []};
optionsSeries.series = optionsDeepCopy.series;
setChartOptions(optionsSeries);
}, [xxx]);
我在使用 Hooks 的应用程序中使用 Highcharts React 包装器,当我的图表加载或缩放时,它会多次触发 setExtremes 和 setAfterExtremes。我已经浏览过类似的问题,但它们与不同的问题有关。
我已将代码减少到最少的设置,页面不刷新,数据只被解析一次并添加到图表一次,动画被禁用并且它仍然持续触发两个事件 7 次: * 初始种群 * 缩放
版本:react 16.9,highcharts 7.2,highcharts-react-official 2.2.2
图表
<HighchartsReact
ref={chart1}
allowChartUpdate
highcharts={Highcharts}
options={OPTIONS1}
/>
图表选项:
const [series1, setSeries1] = useState([]);
const OPTIONS1 = {
chart: {
type: 'spline',
zoomType: 'x',
animation: false
},
title: {
text: ''
},
xAxis: {
events: {
setExtremes: () => {
console.log('EVENT setExtremes');
},
afterSetExtremes: () => {
console.log('EVENT sfterSetExtremes');
}
},
},
plotOptions: {
series: {
animation: false
}
},
series: series1
};
数据人口:
useEffect(() => {
if (data1) {
const a = [];
_.each(data1.labels, (sLabel) => {
a.push({
name: sLabel,
data: [],
})
});
... POPULATES DATA ARRAYS...
setSeries1(a);
}
}, [data1]);
你的 useEffect 被多次触发可能是因为你正在检查 data1 而 data1 正在改变。您是否尝试过在 useEffect 中放置一个空数组并查看它是否多次触发?
如果它只触发一次,那么问题是你的 useEffect 正在检查一个不断变化的值
如果它仍然触发多次,那么有一些东西触发了你的 useEffect
问题比较老了我也遇到过同样的情况。解决方案是将图表选项移动到状态变量。那么这个事件就不会触发多次了。
图书馆文档中提到了它。 https://github.com/highcharts/highcharts-react -- 见“最佳更新方式”
import { render } from 'react-dom';
import HighchartsReact from 'highcharts-react-official';
import Highcharts from 'highcharts';
const LineChart = () => {
const [hoverData, setHoverData] = useState(null);
// options in the state
const [chartOptions, setChartOptions] = useState({
xAxis: {
categories: ['A', 'B', 'C'],
events: {
afterSetExtremes: afterSetExtremes,
},
},
series: [
{ data: [1, 2, 3] }
],
});
function afterSetExtremes(e: Highcharts.AxisSetExtremesEventObject) {
handleDateRangeChange(e);
}
return (
<div>
<HighchartsReact
highcharts={Highcharts}
options={chartOptions}
/>
</div>
)
}
render(<LineChart />, document.getElementById('root'));```
在 useEffect() 中设置状态后,我遇到了同样的问题。 我的问题是我对整个选项进行了 (lodash) 深度复制。 这也每次都会创建一个新事件。
// Create options with afterSetExtremes() event
const optionsStart: Highcharts.Options = {
...
xAxis: {
events: {
afterSetExtremes: afterSetExtremesFunc,
}
},
....
// Save in state
const [chartOptions, setChartOptions] = useState(optionsStart);
// On Prop Change I update Series
// This update deepcopy whole Options. This adds one Event Every time
React.useEffect(() => {
var optionsDeepCopy = _.cloneDeep(chartOptions);
optionsDeepCopy.series?.push({
// ... Add series data
});
setChartOptions(optionsDeepCopy);
}, [xxx]);
解决方法是只更新系列。不是整个选项。
React.useEffect(() => {
var optionsDeepCopy = _.cloneDeep(chartOptions);
optionsDeepCopy.series?.push({
// ... Add series data
});
const optionsSeries: Highcharts.Options = { series: []};
optionsSeries.series = optionsDeepCopy.series;
setChartOptions(optionsSeries);
}, [xxx]);