When displaying multiple markers on a map, how to open just one info window, when clicking on a marker?

后端 未结 1 1921
迷失自我
迷失自我 2020-12-19 12:16

I\'m using react-google-maps to display a map with markers, and when you click on a marker, all the info windows open up. I would like to display only one marker\'s info win

1条回答
  •  爱一瞬间的悲伤
    2020-12-19 13:07

    It's more of a React question. You can pass the index of a clicked Marker to onToggleOpen and instead of isOpen you use a selectedPlace state that holds the index of a clicked Marker and use this index to render the right InfoWindow.

    Here is an example (not fully tested, but you can get the idea):

    /*global google*/
    import React from "react"
    import { compose, withProps, withHandlers, withState, withStateHandlers } from "recompose"
    import { withScriptjs, withGoogleMap, GoogleMap, Marker, InfoWindow } from "react-google-maps"
    
    const MyMapComponent = compose(
        withProps({
            googleMapURL: "https://maps.googleapis.com/maps/api/js?v=3.exp&libraries=geometry,drawing,places",
            loadingElement: 
    , containerElement:
    , mapElement:
    , }), withScriptjs, withGoogleMap, withState('places', 'updatePlaces', ''), withState('selectedPlace', 'updateSelectedPlace', null), withHandlers(() => { const refs = { map: undefined, } return { onMapMounted: () => ref => { refs.map = ref }, fetchPlaces: ({ updatePlaces }) => { let places; const bounds = refs.map.getBounds(); const service = new google.maps.places.PlacesService(refs.map.context.__SECRET_MAP_DO_NOT_USE_OR_YOU_WILL_BE_FIRED); const request = { bounds: bounds, type: ['hotel'] }; service.nearbySearch(request, (results, status) => { if (status == google.maps.places.PlacesServiceStatus.OK) { console.log(results); updatePlaces(results); } }) }, onToggleOpen: ({ updateSelectedPlace }) => key => { updateSelectedPlace(key); } } }), )((props) => { console.log(props); return ( {props.places && props.places.map((place, i) => props.onToggleOpen(i)} key={i} position={{ lat: place.geometry.location.lat(), lng: place.geometry.location.lng() }}> {props.selectedPlace === i &&
    {props.places[props.selectedPlace].name}
    }
    )}
    ) }) export default class MyFancyComponent extends React.PureComponent { render() { return ( ) } }

    0 讨论(0)
提交回复
热议问题