【问题标题】:Google Maps React, adding markers with lat lngGoogle Maps React,使用 lat lng 添加标记
【发布时间】:2019-08-11 07:26:00
【问题描述】:

我正在使用“google-maps-react”并尝试通过点击向我的地图添加新标记。

我目前设法通过控制台记录特定的 latLng,但似乎无法创建新的。我对 React 很陌生。

我的 onMapClick 用于查找纬度和经度。但我认为我需要将位置添加到数组中,然后使用该位置来更新地图。可能是错的

  onMapClick = (map,maps,e) => { 
    const { latLng } = e; 
    const latitude = e.latLng.lat(); 
    const longitude = e.latLng.lng(); 
    console.log(latitude + ", " + longitude);  

    var marker = new window.google.maps.Marker({
      position: e.latLng,
      setMap: map,
    });
  }

我目前的解决方案是我只是在我的 render() 中用 Marker 中数组的位置硬编码了一些标记

   <Marker
      onClick={this.onMarkerClick}
      name={storedLocations[0]}
      position={{lat:listLatitude[0], lan:listLongitude[0]}}
    />   

我的信息窗口是:

<InfoWindow
        marker={this.state.activeMarker}
        visible={this.state.showingInfoWindow}
       onClose={this.onClose}
     >
      <div>
        <h4>{this.state.selectedPlace.name}</h4>
      </div>
    </InfoWindow>
  </Map>

【问题讨论】:

    标签: reactjs google-maps


    【解决方案1】:

    我的 onMapClick 用于查找纬度和经度。但是我 认为我需要将位置添加到数组中,然后使用该位置 更新地图。

    这确实是 React 的方式,但不是通过 Google Maps API 实例化标记,而是考虑通过 state 保留数据(标记位置),React 将像这样完成其余的工作:

    class MapContainer extends React.Component {
      constructor(props) {
        super(props);
        this.state = {
          locations: []
        };
        this.handleMapClick = this.handleMapClick.bind(this);
      }
    
      handleMapClick = (ref, map, ev) => {
        const location = ev.latLng;
        this.setState(prevState => ({
          locations: [...prevState.locations, location]
        }));
        map.panTo(location);
      };
    
      render() {
        return (
          <div className="map-container">
            <Map
              google={this.props.google}
              className={"map"}
              zoom={this.props.zoom}
              initialCenter={this.props.center}
              onClick={this.handleMapClick}
            >
              {this.state.locations.map((location, i) => {
                return (
                  <Marker
                    key={i}
                    position={{ lat: location.lat(), lng: location.lng() }}
                  />
                );
              })}
            </Map>
          </div>
        );
      }
    }
    

    解释:

    • locations状态用于在点击地图后跟踪所有位置

    • locations 状态传递给 Marker 组件以渲染标记

    下一步可能是为标记列表引入一个单独的组件,Thinking in React 告诉组件如下:

    其中一种技术是单一职责原则,即 理想情况下,组件应该只做一件事。如果它最终增长,它 应该分解成更小的子组件。

    const MarkersList = props => {
      const { locations, ...markerProps } = props;
      return (
        <span>
          {locations.map((location, i) => {
            return (
              <Marker
                key={i}
                {...markerProps}
                position={{ lat: location.lat(), lng: location.lng() }}
              />
            );
          })}
        </span>
      );
    };
    

    Here is a demo 演示如何通过google-maps-react 库在地图上点击添加制造商

    【讨论】: