谷歌地图反应只显示状态数组中最后渲染对象的标记

Posted

技术标签:

【中文标题】谷歌地图反应只显示状态数组中最后渲染对象的标记【英文标题】:Google maps react only displaying marker of last rendered object from state array 【发布时间】:2020-01-06 17:18:31 【问题描述】:

我在从状态数组中渲染谷歌地图标记时遇到问题。 Only the last rendered marker is shown although all of the markers are listed in react components

我正在使用 google-maps-react 显示一个位置,其中包含许多代表书友会的标记。我从 Rails API 中获取标记的地址,将它们循环到地理编码器中并在循环中设置状态。州内的每个对象都有 lat、lng 和 data 的 bookclubs。

我通过表单接收中心地图位置。表单中的数据通过地理编码器并设置为地图的状态。

当我使用 state.markers 中的数据添加标记时,只会显示最后一个编码标记。这适用于我是否遍历 state.markers。

import React,  Component  from "react";
import  Map, InfoWindow, Marker, GoogleApiWrapper  from "google-maps-react";

class GoogleMaps extends Component 
  constructor(props) 
    super(props);
    this.state = 
      markers: [],
      lat: null,
      lng: null,
      showingInfoWindow: false,
      activeMarker: ,
      selectedPlace: 
    ;
  

  componentDidMount() 

    fetch("RAILS API ROUTE", 
      method: "GET",
      headers: 
        "Content-Type": "application/json",
        Authorization: "Bearer " + sessionStorage.JWT
      
    )
      .then(e => e.json())
      .then(data => 
        let bookClubs = data.book_clubs;
        console.log("let", bookClubs);
        bookClubs.forEach(club => 
          const googleMapsClient = require("@google/maps").createClient(
            key: "API KEY",
            Promise: Promise
          );
          googleMapsClient
            .geocode(
              address: `$(club.address.address_line1,
              club.address.address_line2,
              club.address.city)`
            )
            .asPromise()
            .then(response => 
              console.log("response!!!!!!!!!!!!!", response.json.results);
              let info = 
                lat: response.json.results[0].geometry.location.lat,
                lng: response.json.results[0].geometry.location.lng,
                bookClub: club
              ;
              let dataCopy = this.state.markers
              dataCopy.push(info);

              this.setState(
                
                  markers: dataCopy
                ,
                () => 
                  console.log("State::::", this.state.markers);
                
              );
            );
        );

      )
      .catch(error => console.error("Error:", error));
  

  onMarkerClick = (props, marker, e) =>
    this.setState(
      selectedPlace: props,
      activeMarker: marker,
      showingInfoWindow: true
    );

  onMapClicked = props => 
    if (this.state.showingInfoWindow) 
      this.setState(
        showingInfoWindow: false,
        activeMarker: null
      );
    
  ;



  render() 
    return (
      <div
        style= display: "flex", flexDirection: "flexEnd", flexWrap: "wrap" 
      >




        this.state.lat != null && (
          <Map
            onClick=this.onMapClick
            google=this.props.google
            initialCenter=
              lng: this.state.lng,
              lat: this.state.lat
            
            center=
              lng: this.state.lng,
              lat: this.state.lat
            
            containerStyle=
              width: "100%",
              height: "250px",
              position: "relative"
            
            style=
              height: "35vh",
              width: "35vh",
              display: "flex",
              justifyContent: "flexEnd"
            
            zoom=14
          >


            this.state.markers.map((e, i) => (
              <Marker
                key=i
                onClick=this.onMarkerClick
                position= lat: e.lat, lng: e.lng 
                title=`$e.bookClub.address.address_line1  $e.bookClub.address.address_line2`
                name=e.bookClub.address.city
              />
            ))

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

export default GoogleApiWrapper(
  apiKey: "API KEY"
)(GoogleMaps);


【问题讨论】:

您能否提供一个您的读书俱乐部数据样本,或者最好提供一个代码沙盒或 stackBlitz,以便我们可以从我们这边复制它? 我发现了问题。很抱歉没有早点发布这个。我需要在地理编码器中写下不带任何逗号的地址。像这样:地址:$club.address.address_line1 $club.address.address_line2 $club.address.city 酷!感谢您的更新并与社区分享解决方案! :) 【参考方案1】:

问题是我在将数据插入地理编码器时添加了逗号。

 googleMapsClient
            .geocode(
              address: `$(club.address.address_line1,
              club.address.address_line2,
              club.address.city)

我删除了逗号并制作了如下代码,这解决了我的问题。

googleMapsClient
            .geocode(
              address: `$club.address.address_line1 $club.address.address_line2 $club.address.city `
            )

仅显示最后一个标记的原因是,当我有逗号时,地理编码器为所有标记提供了相同的 lat 和 lng。这导致它们都在同一位置相互覆盖,而最后渲染的标记留在顶部。

【讨论】:

以上是关于谷歌地图反应只显示状态数组中最后渲染对象的标记的主要内容,如果未能解决你的问题,请参考以下文章

在本机反应中从谷歌地图中删除标记

无法单击标记 - 谷歌地图集群Android,无法在谷歌地图中显示信息窗口

谷歌地图没有从数据库中提取我的标记

谷歌地图标记只显示图标

无法在谷歌地图中添加多个标记(颤振)

谷歌地图标记聚类不适用于缩小