如何在添加标记时重新居中 react-google-maps

how to re-center react-google-maps on adding marker

我正在使用 @react-google-maps/api 在地图中显示一些标记。

我想在单击按钮时添加另一个标记,添加标记后,我希望地图居中显示所有标记。据此,我是这样写的:

const center = {
  lat: 55.378,
  lng: 3.436
};

const containerStyle = {
    borderRadius: '10px',
    width: '100%',
    height: '100%'
}

function Map(props) {
    const [map, setMap] = useState();
    const [markers, setMarkers] = useState([
        {
            lat: 51.378, 
            lng: 3.436
        }, 
        {
            lat: 47.0902, 
            lng: -125.712
        }
    ]);

    useEffect(() => {
        var bounds = new window.google.maps.LatLngBounds();
        for(var i = 0; i < markers.length; i++) {
            bounds.extend( new window.google.maps.LatLng(markers[i].lat, markers[i].lng));
        }

        map.fitBounds(bounds)
    }, [markers])

    const onLoad = React.useCallback(function callback(map) {
    const bound = new window.google.maps.LatLngBounds();
        setBounds(bound)
    map.fitBounds(bound);
    setMap(map)
  }, [])

  return (
        <>
    <div className={props.className}>
            <LoadScript
                googleMapsApiKey="API_KEY"
            >
                <GoogleMap
                    mapContainerStyle={containerStyle}
                    center={center}
                    zoom={10}
                    onLoad={onLoad}
                >
                {
                    markers.map((item) => {
                        return (
                            <Marker animation="DROP" position={{lat: item.lat, lng: item.lng}}/>
                        )
                    })
                }
                </GoogleMap>
            </LoadScript>
        </div>
        <button onClick={(e) => { e.preventDefault(); console.log("hehe"); const hoho = [...markers, {lat: 59.913, lng: 10.752}]; setMarkers(hoho)}}>Add marker</button>
        </>
    )
}

但是当我 运行 代码时,这是我得到的错误:

TypeError: Cannot read properties of undefined (reading 'maps').

正是 useEffect 中的这一行给我错误:

var bounds = new window.google.maps.LatLngBounds();

如何获得正确的边界值?我尝试创建一个状态变量并在 onLoad() 中获取它后更新该值,但这也不起作用。我该如何解决这个问题?

您的 useEffect<LoadScript> 加载 API 之前执行。我会做类似的事情:

useEffect(() => {
  if (map) {
    var bounds = new window.google.maps.LatLngBounds();
    for(var i = 0; i < markers.length; i++) {
      bounds.extend( new window.google.maps.LatLng(markers[i].lat, markers[i].lng));
    }
    map.fitBounds(bounds)
  }
}, [markers, map])

map 仅在 API、window.google.maps.*** 已加载时才会被定义。