Почему я не вижу никаких маркеров на картах Google react?

#javascript #reactjs #google-maps #marker

#javascript #reactjs #google-карты #маркер

Вопрос:

Я создавал интерфейс приложения, в котором включен Google maps API. Я хочу, чтобы пользователь нажимал на карту, чтобы добавить маркеры, и сохранял ее в массив; Однако после того, как я реализовал функцию добавления маркера в onClick тега Google map… Маркеры не отображаются.

У меня возникли большие трудности с реализацией функции добавления маркера в react, и я просмотрел несколько руководств, но, похоже, не могу найти решение. Любая помощь была бы очень признательна!

     const options = {
        styles: mapStyles,
        disableDefaultUI: true,
        zoomControl: true,
    }

    var markersArray = [];
    function addMarker(event){
            let marker = new window.google.maps.Marker({
            position: event.latLng,
            time: new Date(),
            draggable: true
        });
        markersArray.push(marker);
    }


    const Map = withScriptjs(withGoogleMap(props =>
        <GoogleMap
          defaultZoom={8}
          defaultCenter={{ lat: this.state.mapPosition.lat, lng: this.state.mapPosition.lng }}
          options={options}
          onClick={(event) => {
            console.log(event);
            console.log(markersArray);
            addMarker(event);
        }}
        >

        {markersArray.map((marker) =>(
            <Marker
                key={marker.time.toISOString()}
                position={{lat: marker.lat, lng: marker.lng }}
            />
        ))}

        <AutoComplete
            style={{width: "100%", height:'40px'}}
            types={['(regions)']}
            onPlaceSelected={this.onPlaceSelected}
        />

        </GoogleMap>
      ));
      
  

Я считаю, что проблема в этом, но я не уверен, как заставить это работать.

         {markersArray.map((marker) =>(
            <Marker
                key={marker.time.toISOString()}
                position={{lat: marker.lat, lng: marker.lng }}
            />
        ))}
  

Ответ №1:

markersArray это обычный массив. Когда вы это делаете addMarker(event); , вы не обновляете состояние своего компонента, это просто обычный массив. Так что, вероятно, React не знает об этом изменении. Если вы используете хуки, вы могли бы создать состояние с вашими маркерами следующим образом

 const [markers, setMarkers] = useState([])
  

используйте этот markers массив для рендеринга <Marker /> , а затем на вашем мероприятии, чтобы добавить маркер

 onClick={(event) => {
  setMarker(previousMarkers => previousMarkers.concat([event]))
}
  

это вызовет повторный рендеринг с новым значением markers , и вы сможете их увидеть.

Если это не функциональный компонент, а классы, это одно и то же, но вы бы определили маркеры в состоянии вашего класса

 constructor(props) { 
  super(props)
  this.state = { markers: [] }
  this.addMarker = this.addMarker.bind(this)

}

// function class below
addMarker(marker) {
  this.setState(previousState => previousState.concat([marker])
}
  

и в вашем случае вы бы вызвали this.addMarker(marker)