React - компонент Google Maps не отображается после componentDidMount

У меня просто возникают проблемы с отображением моих карт Google, когда происходит поиск (с почтовым индексом). Похоже, что карта отображает нулевой центр карты, а затем не выполняет повторную визуализацию после setState в componentDidMount (), поскольку карта отображается пустой / серой, но при жестком обновлении карта загрузится с почтовым индексом. Я безуспешно пробовал использовать componentWillMount (), у кого-нибудь есть предложения?

Это код моей страницы поиска:

class SearchContainer extends Component {
  constructor(props) {
    super(props);
    this.state = {
      map_centre: null
    };
  }

  componentDidMount() {
    const values = queryString.parse(this.props.location.search);
    axios
      .get("api/v1/search?postcode = " + values.postcode)
      .then(response => {
        var mapCentre = response.data.map_centre;
        this.setState({
          map_centre: mapCentre
        });
      })
      .catch(error => console.info(error));
  }

  render() {
    return (
      <div id = "map" className = "padding-left">
        <GoogleMapComponent
          townCenters = {this.state.townCenters}
          schools = {this.state.schools}
          supermarkets = {this.state.supermarkets}
          hotels = {this.state.hotels}
          airports = {this.state.airports}
          trainStations = {this.state.trainStations}
          map_centre = {this.state.map_centre}
          onMapMounted = {this.handleMapMounted}
          onDragEnd = {this.handleMapChange}
          onZoomChanged = {this.handleMapChange}
          onMarkerClick = {this.handleAdspaceShow}
          googleMapURL = {url}
          loadingElement = {<div style = {{ height: `100vh`, width: `100%` }} />}
          containerElement = {<div style = {{ height: `100vh`, width: `100%` }} />}
          mapElement = {<div style = {{ height: `100vh`, width: `100%` }} />}
        />
        <img
          src = {mapSearch}
          id = "map-search-button"
          onClick = {this.toggleSearchInput}
        />
        <input
          id = "map-search-input"
          className = "form-control d-none"
          type = "search"
          placeholder = "Enter new location"
          aria-label = "Search"
          onChange = {this.handlePostcodeChange}
          onKeyPress = {this.handleNewSearch}
        />
      </div>
    );
  }
}

Это код моего компонента Google Maps:

const GoogleMapComponent = withScriptjs(
  withGoogleMap(props => (
    <GoogleMap
      defaultZoom = {13}
      defaultCenter = {props.map_centre}
      onDragEnd = {props.onDragEnd}
      onZoomChanged = {props.onZoomChanged}
      ref = {props.onMapMounted}
    />
  ))
);

Вы пробовали использовать опору center вместо map_centre в компоненте GoogleMapComponent?

Tholle 31.07.2018 17:42

@Tholle, не могли бы вы объяснить, что имеете в виду?

Shirley Deng 31.07.2018 17:49

Я сам не использовал эту библиотеку, но глядя на документацию компонент GoogleMap, похоже, не имеет опоры map_centre, а опоры center.

Tholle 31.07.2018 17:50

Я думаю, что это немного другое, так как я не жестко программирую defaultCenter. Я получаю defaultCenter в моей функции componentDidMount

Shirley Deng 31.07.2018 17:52

Да, но вы передаете карте значение, полученное из запроса axios, как map_centre. Карта не знает, что делать с map_centre, только center.

Tholle 31.07.2018 17:53

Но map_centre - это просто имя состояния, и вы можете видеть, что оно отслеживается до фактического компонента GoogleMap в defaultCenter, с которым карта действительно что-то делает?

Shirley Deng 31.07.2018 17:58

Да, вы правы, но defaultCenter - это только начальный центр. После первоначального рендеринга он больше не будет использоваться картой. Если вместо этого вы используете center на GoogleMap, он, скорее всего, обновится должным образом.

Tholle 31.07.2018 18:00

А я так понял, думал будет после каждого рендера. Большое спасибо!

Shirley Deng 31.07.2018 18:05

Большой! Пожалуйста.

Tholle 31.07.2018 18:08

Подумайте о принимая мой ответ, если вы считаете, что он ответил на ваш вопрос.

Tholle 02.08.2018 04:45
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
10
951
2

Ответы 2

defaultCenter будет использоваться картой только для первоначального рендеринга, поэтому он не будет иметь никакого эффекта, если вы измените это значение позже.

Если вместо этого вы используете опору center, она будет работать должным образом.

const GoogleMapComponent = withScriptjs(
  withGoogleMap(props => (
    <GoogleMap
      defaultZoom = {13}
      center = {props.map_centre}
      onDragEnd = {props.onDragEnd}
      onZoomChanged = {props.onZoomChanged}
      ref = {props.onMapMounted}
    />
  ))
);

Будьте более конкретными с библиотекой, которую вы используете ... вы добавили теги "google-maps-react" и "response-google-map", и оба являются разными библиотеками ...

google-maps-react = https://github.com/fullstackreact/google-maps-react

реагировать-google-map = https://tomchentw.github.io/react-google-maps/

Во всяком случае, я вижу 2 варианта:

решение 1:

Добавьте условие, которое отображает GoogleMapComponent, только если map_centre не равно нулю.

  render() {
    if (this.state.map_centre){
      return (
        <div id = "map" className = "padding-left">
          <GoogleMapComponent
            townCenters = {this.state.townCenters}
            schools = {this.state.schools}
            supermarkets = {this.state.supermarkets}
            hotels = {this.state.hotels}
            airports = {this.state.airports}
            trainStations = {this.state.trainStations}
            map_centre = {this.state.map_centre}
            onMapMounted = {this.handleMapMounted}
            onDragEnd = {this.handleMapChange}
            onZoomChanged = {this.handleMapChange}
            onMarkerClick = {this.handleAdspaceShow}
            googleMapURL = {url}
            loadingElement = {<div style = {{ height: `100vh`, width: `100%` }} />}
            containerElement = {<div style = {{ height: `100vh`, width: `100%` }} />}
            mapElement = {<div style = {{ height: `100vh`, width: `100%` }} />}
           />
          <img
          src = {mapSearch}
          id = "map-search-button"
          onClick = {this.toggleSearchInput}
          />
          <input
          id = "map-search-input"
          className = "form-control d-none"
          type = "search"
          placeholder = "Enter new location"
          aria-label = "Search"
          onChange = {this.handlePostcodeChange}
          onKeyPress = {this.handleNewSearch}
          />
      </div>);
     }
     return <div> Loading.. </div>;
  }

решение 2:

Перед получением ответа установите широту / долготу по умолчанию (не ноль).

constructor(props) {
    super(props);
    this.state = {
      map_centre: { lat: -34.397, lng: 150.644 }
    };
  }

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