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>

Написание этого здесь, чтобы помочь любому, кто может столкнуться с этим самим.

Другие вопросы по тегам