Я пытаюсь пронумеровать свои маркеры и показать InfoWindow с помощью google-maps-react

Кажется, я не могу показать индекс из моего json в google-maps-react, я вижу все отмеченные маркеры, но они показывают маркер по умолчанию без всплывающего окна. Вот код с размещенным <InfoWindow>, реакция жаловалась, что мне нужно поместить родительский div, когда я это делаю, в настоящее время я не вижу никаких маркеров.

Мой car2go json отображается правильно, просто не распечатывает name={content.name}.

Мой компонент map.js:

import React, { Component } from "react";
import Car2go from "../data/car2go/vehicles.json";
import { Map, InfoWindow, Marker, GoogleApiWrapper } from "google-maps-react";

export class MapContainer extends Component {
  constructor(props) {
    super(props);
    this.onMarkerClick = this.onMarkerClick.bind(this);
    this.state = {
      showingInfoWindow: false,
      activeMarker: {},
      selectedPlace: {},
      name: null
    };
  }
  onMarkerClick(props, marker, e) {
    this.setState({
      selectedPlace: props,
      activeMarker: marker,
      showingInfoWindow: true
    });
  }
  render() {
    const google = window.google;
    const style = {
      width: "70%",
      height: "70%",
      margin: "0 auto"
    };
    //const google = window.google;
    return (
      <Map
        google={this.props.google}
        style={style}
        initialCenter={{
          lat: 53.59301,
          lng: 10.07526
        }}
        zoom={12}
        onClick={this.onMapClicked}
      >
        {Car2go.placemarks.map((content, index) => {
          return (
            <div>
              <Marker
                title={index}
                name={content.name}
                position={{
                  lat: content.coordinates[1],
                  lng: content.coordinates[0]
                }}
                onClick={this.onMarkerClick}
                name={content.name}
              />

              <InfoWindow
                marker={this.state.activeMarker}
                visible={this.state.showingInfoWindow}
              >
                <div>
                  <h1>{this.state.selectedPlace.name}</h1>
                </div>
              </InfoWindow>
            </div>
          );
        })}
      </Map>
    );
  }
}

export default GoogleApiWrapper({
  apiKey: "xxxxx"
})(MapContainer);

person artworkjpm    schedule 11.05.2019    source источник


Ответы (1)


Я предполагаю, что React жалуется на ошибку, похожую на эту:

React не распознает реквизит mapCenter в элементе DOM

Если это так, основная причина этой ошибки связана с обертыванием компонента Marker контейнером div:

<div>
    <Marker 
       ...  
    />
</div>

и способ, которым компонент google-maps-react Map отображает дочерние элементы. В этом случае Map props переносятся в div элемент вместо Marker компонента. Подробнее см. в статье Предупреждение о неизвестном реквизите.

Чтобы обойти эту ошибку, можно рассмотреть следующий подход:

  • замените контейнер div на React.Fragment
  • явно передавать реквизиты карты компоненту Marker

Вот пример:

class Map extends Component {
  constructor() {
    super();
    this.state = {
      map: null
    };
    this.handleMapReady = this.handleMapReady.bind(this);
  }

  handleMapReady(mapProps, map) {
    this.setState({ map: map });
  }

  render() {
    return (
      <Map
        google={this.props.google}
        className={"map"}
        initialCenter={this.props.center}
        zoom={this.props.zoom}
        onReady={this.handleMapReady}
      >
        {this.state.map &&
          places.map((place, i) => {
            const mapProps = Object.assign({}, this.props);
            mapProps.map = this.state.map;
            return (
              <React.Fragment key={i}>
                <Marker
                  {...mapProps}
                  onClick={this.handleMarkerClick}
                  position={place.position}
                  placeIndex={i}
                  name={place.name}
                />
              </React.Fragment>
            );
          })}
      </Map>
    );
  }
}

Но вместо изменений, описанных выше, я бы предложил другой подход, в частности, создать один экземпляр компонента InfoWindow и управлять им, как показано ниже:

<Map
    google={this.props.google}
    className={"map"}
    initialCenter={this.props.center}
    zoom={this.props.zoom}
  >
    {places.map((place, i) => {
      return (
        <Marker
          key={i}
          onClick={this.handleMarkerClick}
          position={place.position}
          placeIndex={i}
          name={place.name}
        />
      );
    })}
    <InfoWindow
      marker={this.state.activeMarker}
      visible={this.state.showingInfoWindow}
      onClose={this.handleClose}
    >
      <div>{this.state.selectedPlace.name}</div>
    </InfoWindow>
  </Map>

Вот демо

person Vadim Gremyachev    schedule 14.05.2019