【发布时间】:2019-02-01 20:54:31
【问题描述】:
我有一个应用程序,其中包含图表底部的复选框(通过图例项)。
当我调整应用程序窗口大小时,事件侦听器(记录“调整大小”事件)会相应地更改图表宽度,并且图表上会出现一个新复选框。
当图表主题改变时,也会出现一个新的复选框。
这让我相信,每当重新渲染 Highcharts(我使用 React)时,都会创建一个新的复选框。
一开始只有一个复选框:
单次调整页面大小后:
多次调整大小后:
此外,图表右上角总是有一个复选框(在第一次调整大小后出现):
复选框仅在 componendDidMount() 循环中添加到图表一次。使用此选项将其添加到单个系列中:
showCheckbox: true
在主组件循环componentDidMount中第一次也是唯一一次调用生成图表并设置此选项的函数:
主容器
import Charts from './Charts';
import * as highcharts from 'highcharts';
class MainComponent exteds React.Component<Props, State> {
public async componentDidMount() {
try {
// Here the charts are generated
const initialOpts = Charts.generateCharts();
const min = 1000;
const max = 5000;
highcharts.charts.map(chart => {
chart.xAxis[0].setExtremes(min, max, undefined, false)
});
} catch { ... }
this.chartDimensionsHandler();
window.addEventListener('resize', this.chartDimensionsHandler);
}
private chartDimensionsHandler() {
const chartHeight: number = ZoomService.getChartHeight();
this.setState({ chartHeight });
// When the state is set, component re-renders and causes the issue
}
/*
Theme is passed as props to the main component thus whenever theme changes,
new props arrive and component along with higcharts is also
re-rendered what causes a new checkbox to appear on top right of the chart
*/
}
图表类
export class ChartService {
public generateCharts() {
return this.charts.map((char) => this.generateDataChart(chart));
}
private generateDataChart(chart: Chart): Options {
const { slices } = chart;
const xValues = slices.map(slice =>
Number(slice[chart.xAxis.name].value)
);
const xAxis = this.generateXAxisOptions(chart);
const yAxis = [ ... ];
const options = { xAxis, yAxis };
// Create line series
try {
const lineSeries = this.constructDataSeries(chart, xValues);
// Create events series
const eventsCharts = this.charts.filter(
x => x.type === 'events'
);
const eventsSeries = eventsCharts.map((evChart: Chart) => {
// Here I call a function which sets 'showCheckbox' to true
const allEvents = this.createEventSeries(evChart!)[0];
allEvents.yAxis = 1;
return allEvents;
});
const otherSeries = ...; // Irrelevant code
// Add all series
const series = [...otherSeries, ...eventsSeries];
return Object.assign(options, { series });
} catch (e) {
return Object.assign(
options,
{ series: [] },
{
lang: {
noData: `Fail.`
}
}
);
}
}
private constructEventSeries(chart) {
const { slices, yAxis, xAxis } = chart;
const xValues = slices.map(slice =>
Number(slice[xAxis.name].value)
);
return yAxis.map((item) => ({
name: item.label,
type: 'line',
data: this.convertEventData(slices, xValues),
lineWidth: 0,
showCheckbox: true, // THE PLACE WHERE I SET showCheckbox to true
marker: {
enabled: true,
radius: 10,
symbol : 'circle'
},
meta: {
type: 'events'
}
}));
}
}
有谁知道为什么每次渲染图表时都会在图表中添加一个新复选框(无论图表是否调整大小)?
【问题讨论】:
-
显示相关代码。
-
控制台有警告吗?你在用地图吗?一般来说,您应该提供您的代码或沙箱来重新创建相同的问题
-
@GabrielePetrioli 编辑帖子,添加代码。
-
@Amir-Mousavi 应用程序中的代码非常解构,很难将所有内容移入沙箱,抱歉。我将代码附加到这篇文章中
-
所以我很确定问题出在映射期间的索引上,每次重新渲染时,与复选框相关的 dom 元素都会被复制。您在控制台中没有收到有关
key的任何警告吗?可以更深入地检查代码 ASA 到我的笔记本电脑
标签: reactjs highcharts