Ошибка, выданная библиотекой Highchart
, означает, что она не может найти div с указанным вами id
.Казалось бы, componentWillReceiveProps
вызывается перед рендерингом.
Я бы порекомендовал вам вызвать ваш highChartFunction
внутри componentDidMount
метода жизненного цикла и сохранить экземпляр Chart
в свойстве класса для доступа к нему позже.componentDidMount
вызывается сразу после первого вызова render
, поэтому элемент должен быть создан в этой точке.
componentDidMount() {
this.highChartFunction();
}
highChartFunction () {
const { title, subtitle, id, data, categories, graphData } = this.props;
this.chart = Highcharts.chart(String(id), {
//... options
});
}
Если вы хотите обрабатывать обновления реквизита, я бы порекомендовал использовать componentDidUpdate
,поскольку componentWillReceiveProps
помечен как устаревший и планируется удалить в React 17. Также, похоже, в нем есть некоторые ошибки.componentDidUpdate
получает предыдущий props
в качестве аргумента, чтобы вы могли проверить, требуется ли обновление:
componentDidUpdate(prevProps) {
if ("somehow prevProps and this.props is different") { // Replace with check
this.chart.update({
// new options
}, /* Here is an argument to set if the chart should be rerendered, you can set it if necessary */);
}
}
Также не забудьте установить метод жизненного цикла componentWillUnmount
для уничтожения диаграммы:
componentWillUnmount() {
this.chart.destroy();
}
Личная рекомендация : я бы не стал использовать id
для настройки графика, а вместо этого использовал бы Refs .Это ссылки на компонент, который, на мой взгляд, намного лучше, чем поиск id
.
constructor() {
this.chartContainer = React.createRef();
}
highChartFunction() {
/* ... */
Highcharts.chart(this.chartContainer.current, { ... });
}
render() {
const { id } = this.props;
return (<div key={id} id={id} ref={this.chartContainer} />)
}
Вот минимальный пример со всем, что я упомянул здесь.