react-google-maps:如何使用 fitBounds、panBy、panTo、panToBounds 公共 API?

Posted

技术标签:

【中文标题】react-google-maps:如何使用 fitBounds、panBy、panTo、panToBounds 公共 API?【英文标题】:react-google-maps: how to use fitBounds, panBy, panTo, panToBounds public APIs? 【发布时间】:2017-11-13 05:00:04 【问题描述】:

根据React Google Maps library,可以从ref对象调用这四个方法。

看起来很奇怪的是,这些方法应该接收两个参数,一个地图实例和其他参数,如下所示:

fitBounds(map, args)  return map.fitBounds(...args); 

但是,当以这种方式调用 fitBounds() 时,地图上不会发生任何事情,不会更改边界,也不会引发错误。这是我构建组件的方式,在 componentDidUpdate 中调用 fitBounds:

import React from 'react'
import  withGoogleMap, GoogleMap, InfoWindow, Marker, OverlayView  from 'react-google-maps'
import InfoBox from 'react-google-maps/lib/addons/InfoBox'
import map from 'lodash/map'

// Higher-Order Component
const AllocatedPlacesMap = withGoogleMap(props => (
  <GoogleMap
    center=props.center
    defaultZoom=4
    options= scrollwheel: false, minZoom: 3, maxZoom: 15 
    onCenterChanged=props.onCenterChanged
    ref=props.onMapMounted>
    props.markers.map((marker, index) => (
      <Marker
        key=index
        position=marker.position
      />
    ))
  </GoogleMap>
));

class Map extends React.Component 
  constructor(props) 
    super(props);
    this.state = 
    ;
  

  getCenter = () => 
    this._bounds = new google.maps.LatLngBounds();

    this.props.markers.forEach((marker, index) => 
      const position = new google.maps.LatLng(marker.lat, marker.lng);
      this._bounds.extend(position);
    );

    return this._bounds.getCenter();
  

  componentDidUpdate() 
    this._map.fitBounds(this._map, this._bounds);
  

  handleMapMounted = (map) => 
    this._map = map;
  

  render() 
    return (
      <div className="allocated-places">
        <AllocatedPlacesMap
          containerElement=
            <div style= height: `100%`  />
          
          mapElement=
            <div style= height: `100%`  />
          
          center=this.getCenter()
          markers=props.markers
          onMapMounted=this.handleMapMounted
        />
      </div>
    )
  


export default Map;

知道在这种情况下调用 fitBounds() 的正确方法是什么吗?在这方面似乎缺乏文档和示例。

【问题讨论】:

fitBounds() 不再需要地图实例作为第一个参数。此错误也在库的 v9 中得到修复。 【参考方案1】:

查看函数定义fitBounds(map, args) return map.fitBounds(...args); ,我们可以看到spread operator 应用于args。这表明 args 应该是一个数组。

所以,在您的代码中,第二个参数应该是数组类型:

this._map.fitBounds(this._map, [this._bounds]);

您还可以包含数组的第二个元素,该元素将被转换为 Maps javascript API fitBound() 方法的第二个可选参数 padding

this._map.fitBounds(this._map, [this._bounds, 100]);

希望这会有所帮助!

【讨论】:

谢谢!但是this._bounds 是一个对象,因此扩展运算符应该可以在不将其包装在数组中的情况下工作。我尝试包装它只是为了测试,但没有任何反应,没有错误,地图不适合标记。 如果散布对象,您将拥有该对象的可迭代属性作为 map.fitBounds() 的参数。但根据documentation,第一个参数必须是整个 LatLngBounds 或 LatLngBoundsLiteral。你可以尝试在这个函数调用处设置断点并检查 this._bounds 对象吗? 初始渲染有这个问题吗?文档说:“componentDidUpdate() 在更新发生后立即调用。初始渲染不调用此方法。” facebook.github.io/react/docs/…【参考方案2】:

这就是你如何使用 react map ref 调用 panTo 和 fitBounds

this.map.panTo(
  lat:e.latLng.lat(), lng: e.latLng.lng()
)
const bounds = new google.maps.LatLngBounds()
bounds.extend(
  lat:e.latLng.lat(), lng: e.latLng.lng()
)
this.map.fitBounds(bounds)

【讨论】:

以上是关于react-google-maps:如何使用 fitBounds、panBy、panTo、panToBounds 公共 API?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 react-google-maps 通过单击在地图上添加标记?

如何在 react-google-maps 中添加标记?

react-google-maps:如何使用 fitBounds、panBy、panTo、panToBounds 公共 API?

如何将自定义按钮添加到 react-google-maps?

如何使用 react-google-maps 在 React.JS 中获取多边形的坐标

如何更改 React-Google-Maps 多边形的样式选项 onHover?