response-google-maps TypeError: объект не поддерживает свойство или метод setZoom

Я использую в своем приложении пакет react-google-maps. Я хочу получить доступ к методу Map.setZoom (), но получаю

TypeError: объект не поддерживает свойство или метод setZoom.

Интересно, что метод Map.panTo() отлично работает. Оба они должны быть членами объекта Map.

https://developers.google.com/maps/documentation/javascript/reference/3.exp/map#Map.panTo https://developers.google.com/maps/documentation/javascript/reference/3.exp/map#Map.setZoom

withHandlers(() => {
    const refs = {
      map: undefined
    }

    return {
      onMapMounted: () => ref => {
        refs.map = ref
      },

      onClick: () => () => {
        console.log("Getting location...");
        navigator.geolocation.getCurrentPosition(
          position => {
            const coords = {
              lat: position.coords.latitude,
              lng: position.coords.longitude
            };
            console.log(coords);
            refs.map.panTo(coords);   // This line works
            refs.map.setZoom(8);      // This line throws a Type Error
          },
          error => {
            console.log("Error" + error.code);
          }
        );
      }
    }
  }),
...

Вот мое полное определение компонента, основанное на react-google-maps документации https://tomchentw.github.io/react-google-maps/#googlemap

const Map = compose(
  withProps({
    googleMapURL: `${url}`,
    loadingElement: <div style={{ height: `100%` }} />,
    containerElement: <div style={{ height: `400px` }} />,
    mapElement: <div style={{ height: `100%` }} />,
  }),
  withHandlers(() => {
    const refs = {
      map: undefined
    }

    return {
      onMapMounted: () => ref => {
        refs.map = ref
      },

      onClick: () => () => {
        console.log("Getting location...");
        navigator.geolocation.getCurrentPosition(
          position => {
            const coords = {
              lat: position.coords.latitude,
              lng: position.coords.longitude
            };
            console.log(coords);
            refs.map.panTo(coords);
            refs.map.setZoom(8);
          },
          error => {
            console.log("Error" + error.code);
          }
        );
      }
    }
  }),
  withScriptjs,
  withGoogleMap
)((props) =>
  <GoogleMap
    defaultZoom={4}
    defaultCenter={DefaultCoords}
    ref={props.onMapMounted}
  >
    <OverlayView
      position={DefaultCoords}
      mapPaneName={OverlayView.OVERLAY_MOUSE_TARGET}
      getPixelPositionOffset={getPixelPositionOffset}
    >
      <div style={{ background: `white`, border: `1px solid #ccc`, padding: 15 }}>
        <button onClick={props.onClick}>Use GPS</button>
      </div>
    </OverlayView>
    {props.isMarkerShown && <Marker position={DefaultCoords} />}
  </GoogleMap>
);

person leviathan34    schedule 11.07.2018    source источник
comment
Кажется, нет setZoom метода согласно документации.   -  person Tholle    schedule 11.07.2018
comment
Есть один developers.google.com/maps. / documentation / javascript / reference /. Если только я чего-то не понимаю.   -  person leviathan34    schedule 11.07.2018
comment
Вы правы в том, что он существует на обычной карте Google, а не в react-google-map компоненте. Кажется, что нет nofollow " быть методом этого компонента для настройки масштабирования так же, как для панорамирования.   -  person Tholle    schedule 11.07.2018


Ответы (1)


Действительно, GoogleMap класс библиотеки react-google-maps еще не предоставляет setZoom метод.

Одним из решений может быть прямой доступ к классу google.maps.Map и установка масштабирования, как показано ниже:

1) получить доступ к экземпляру google.maps.Map:

 onMapMounted: () => ref  => {
    refs.map = ref
    refs.mapObject = ref.context[MAP];  //<-access google.maps.Map instance
 }

2) где MAP - постоянная из:

import {MAP} from 'react-google-maps/lib/constants'

3) установить масштаб:

 refs.mapObject.setZoom(8);

Демо

person Vadim Gremyachev    schedule 16.07.2018