HTML-контейнер Amchart не найден (React)
РЕДАКТИРОВАТЬ 1 (начальный): кажется, что обратный вызов setState() работает не так, как я ожидал. Например:
this.state = {table: true}
this.setState({table: false}, ()=> console.log(this.state.table));
Завершит сеанс 'true', когда я ожидаю, что он выйдет из режима false.
РЕДАКТИРОВАТЬ 2: Я считаю, что что-то не так с тем, как я обрабатываю мои выпадающие запросы, и это может быть причиной большинства моих проблем. Так что я собираюсь отметить это как решенное, потому что решение Дилипа должно работать. Я обновлю это через пару часов с моим результатом.
РЕДАКТИРОВАТЬ 3(Финал): я использовал оператор switch(), который каким-то образом вызывал несколько случаев и сбрасывал мое состояние.
Я думаю, что понимаю, в чем проблема, однако я не совсем уверен, как ее решить.
Я хочу условно отобразить элемент, прежде чем он будет доступен для функции Amchart create("elementID", chartType). Я надеюсь сделать выпадающее меню, вызвав следующую функцию:
loadBarChart() {
this.setState({ piechart: false, table: false, barchart: true });
var chart = am4core.create("barChartDiv", am4charts.XYChart);
chart.data = this.state.data;
let categoryAxis = chart.xAxes.push(new am4charts.CategoryAxis());
categoryAxis.dataFields.category = "schoolname";
categoryAxis.title.text = "Schools";
let valueAxis = chart.yAxes.push(new am4charts.ValueAxis());
valueAxis.title.text = "Number of Students";
}
И barChartDiv отображается так:
{this.state.barchart && (
<section>
<h1 style={{ textAlign: "center" }}>School Data</h1>
<div id="barChartDiv" style={{ width: "100%", height: "500px" }} />
</section>
)}
Когда я выбираю раскрывающийся список, мне говорят, что barchart имеет значение false, а затем true после следующей ошибки:
Instance.js:128 Uncaught Error: html container not found
Потому что setState() часто не обновляется сразу. Я попытался обойти это путем включения кода loadBarChart() в функцию обратного вызова setState(), но я получаю те же ошибки, что и раньше. Так что я почти уверен, что происходит, что am4core.create() ищет элемент с идентификатором "barChartDiv" до того, как этот элемент рендерится, и поэтому я получаю ошибку html container not found.
Какой лучший способ справиться с этим, кроме использования CSS?
2 ответа
Приведенный ниже код представляет собой пример фрагмента вашей логики, в функции обратного вызова вы сможете получить элемент.
Пожалуйста, проверьте решение и дайте мне знать, если вы столкнулись с какой-либо проблемой или она решена.
Примечание - пример кода, но логика, я надеюсь, то же самое. Откройте консоль и выполните код.
import React, { Component } from 'react';
import './App.css';
class App extends Component {
state = {
countrySelected: null
}
onCountryChange = (e) => {
this.setState({
countrySelected: e.target.value
}, () => {
// getting the id
let id = document.getElementById("barChartDiv");
console.log("id =>", id)
})
}
render() {
return (
<div>
<select onChange={this.onCountryChange}>
<option value="India">India</option>
<option value="USA">USA</option>
</select>
{
this.state.countrySelected === "India" ?
<div id="barChartDiv" style={{ width: "100%", height: "500px" }} />
:
null
}
</div>
);
}
}
export default App;
Я получил эту ошибку в простом HTML/JS.
В момент ошибки я добавил <script>
раздел перед моим <div id="chartdiv"></div>
Решение было разместить <script>
раздел после <div id="chartdiv"></div>
Написание этого здесь, чтобы помочь любому, кто может столкнуться с этим самим.