【问题标题】:GoogleMaps React: Open InfoWindow by Default - not from onClickGoogleMaps React:默认打开 InfoWindow - 不是来自 onClick
【发布时间】:2019-02-06 14:31:22
【问题描述】:

我希望在我的 react 项目的谷歌地图组件中的标记上方默认打开一个信息窗口。

我试图通过为标记组件设置一个 ref 来实现这一点,该处理程序调用标记 onclick 方法来触发信息窗口切换。

但是,尽管我调用了 setState,但我发现状态并未更新。我已经尝试在 componentDidMount 中执行此操作,并且还尝试直接在标记安装处理程序中设置状态。

如果手动点击标记,状态会成功改变。

我看到了this 解决方案,但就在 react 中使用它而言,它有点不雅,我很沮丧,因为我没有看到我的逻辑有任何问题。它应该工作,我想知道为什么它不工作。

任何帮助将不胜感激 - 我的代码如下:

import { Component } from 'react';
import {Map, InfoWindow, Marker, GoogleApiWrapper} from 'google-maps-react';

const style = {
    height:'400px',
    width: '100%'
}

class MapView extends Component {

    constructor() {
        super();
        this.state = {
        showingInfoWindow: true, 
        activeMarker: {},         
        selectedPlace: {}         
      };
    }

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

    onMarkerMounted = element => this.onMarkerClick(element.props, element.marker, element);

    onClose = () => {
      if (this.state.showingInfoWindow) {
        this.setState({
          showingInfoWindow: false,
          activeMarker: null
        });
      }
    };

    render() {
        return(
            <Map
              google={this.props.google}
              style={style}
              initialCenter={{
                lat: {redacted},
                lng: {redacted}
              }}
              zoom={15}
              onClick={this.onMapClicked}
            >
                <Marker ref={this.onMarkerMounted} onClick={this.onMarkerClick}/>
                <InfoWindow
          marker={this.state.activeMarker}
          visible={this.state.showingInfoWindow}
          onClose={this.onClose}
        >
          <div>
            Your Location Here!
          </div>
        </InfoWindow>

            </Map>
        );
    }
} 

export default GoogleApiWrapper({
  apiKey: ('MY_API_KEY')
})(MapView);

【问题讨论】:

    标签: javascript reactjs google-maps google-maps-react


    【解决方案1】:

    我相信你的例子一切都很好。信息窗口未显示的原因似乎是因为一旦触发onMarkerMounted 函数,地图尚未完全加载。

    以下是地图加载后显示信息窗口的更改列表:

    a) 引入mapLoaded 状态来跟踪地图是否已加载:

    this.state = {
      //...  
      mapLoaded: false
    };
    

    并在地图加载后将其设置为true

    handleMapIdle = () => {
        this.setState({
          mapLoaded: true
        });
    }
    
    
    <Map
        google={this.props.google}
        style={style}
        initialCenter={this.props.center}
        zoom={this.props.zoom}
        onIdle={this.handleMapIdle}
      >
      ...
    </Map>
    

    最后在地图加载后初始化标记:

    {this.state.mapLoaded && (
       <Marker ref={this.onMarkerMounted} onClick={this.onMarkerClick} />
    )} 
    

    Here is a demo

    【讨论】:

    • 这很好用,谢谢。所以这里的教训是组件安装!==组件加载。我相信随着我了解更好的反应的内部工作原理,这对我来说会变得更清楚。
    猜你喜欢
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    • 2020-03-30
    • 1970-01-01
    相关资源
    最近更新 更多