azat-io
@azat-io

Принудительная загрузка скрипта на React.js, как?

Здравствуйте!

Написал простенький скрипт вкладок на React.js. По своей задумке он должен был открывать карты на Google Api. Однако для того, чтобы открыть другую карту, судя по всему, скрипт должен обращаться к Google Api повторно.

Проще наверно показать, чем объяснить.

То, что есть сейчас можете посмотреть на Codepen здесь.

Скрипт подгружает первую карту из раздела World. Но после попытки открыть другие вкладки при смене div id не происходит подгрузки новой карты.

Посоветуйте, как можно в данном случае заставить React.js обратиться повторно к скрипту. Ну или просто как заставить всё это дело работать.

Спасибо.
  • Вопрос задан
  • 820 просмотров
Решения вопроса 1
<script type="text/javascript">
  google.load('visualization', '1.1', {packages: ['geochart'], callback: drawVisualization});

  function drawVisualization() { ... }
</script>

Этот кусок кода вообще особняком стоит. Нужно же его интегрировать ... Начнем!

Первым делом поместим функцию drawVisualization в наш js файл:
function drawVisualization(element, commonData, regionData) {
  console.log('elemet', element);
  var data = google.visualization.arrayToDataTable(commonData);
  var mapVisualization = new google.visualization.GeoChart(element);
  mapVisualization.draw(data, regionData);
}


И немного модифицируем главный файл:
<script type="text/javascript">
  google.load('visualization', '1.1', {packages: ['geochart']});
</script>


Затем определим компонент, который будет рисовать карту:
class MapVisualization {

  componentDidMount() {
    this.drawMap();
  }
  
  componentDidUpdate() {
    this.drawMap();
  }
  
  drawMap() {
    drawVisualization(this.refs.mapDiv.getDOMNode(), this.props.commonData, this.props.data);
  }

  render() { 
    return (
      <div ref="mapDiv" />
    );
  }
};


Готово. Все данные поместим в props компонента Tabs и затем изменим его render:
render() {
      var list = this.props.data.map(function(d, i) { return <button type = "button" className = { 'tab' + (i === this.state.current ? ' active' : '') } key = { 'tab-' + i } onClick = { this.handleClick.bind(this, i) }>{d.title}</button>
      }.bind(this));

      const { commonData, data } = this.props;
      const { current } = this.state;
      return (         
        < div className = 'container' >
          <div className='col-12'>
              {list}
              <div className = 'map'>
                <MapVisualization data={data[current].content} commonData={commonData} />
              </div>
          </div>
        </div>
      );
    }


Вместо ссылки я использую конечно-же кнопку.
Конечный результат

Это конечно далеко от идеала, но я так понимаю Вы не давно начали реакт - поэтому пойдет
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Laiff
@Laiff
Front-end developer
Проблема в том, что на момент получения данных от апи гугла этих элементов не существует, то есть из-за того что компоненты реакта и апи карт существуют независимо друг от друга. Я бы посмотрел в сторону их интеграции с помощью скажем https://github.com/tomchentw/react-google-maps
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы