Я работаю над приложением React, которое должно в конечном итоге позволить пользователям привязывать карты;Я развернул то, что у меня есть, до https://codesandbox.io/s/github/khpeek/overlayr. Я адаптировал код из https://codesandbox.io/s/lx947qjv0z, и у меня есть несколько вопросов по поводу исходного кода.
Мой вопрос о events
реквизит, который передается компоненту Map
:
import React, { useEffect } from "react";
import useGoogleMap from "../hooks/useGoogleMap";
export default function Map({ center, zoom, children, events }) {
const { maps, map, mapRef, loading } = useGoogleMap({ zoom, center, events });
useEffect(
() => {
map && map.panTo(center);
},
[center.lat, center.lng]
);
return (
<div className="map-container">
<div ref={mapRef} className="map-ref" />
{!loading &&
React.Children.map(children, child => {
return React.cloneElement(child, { map, maps });
})}
</div>
);
}
В App.js
компонент Map
используется следующим образом:
import React, { useState } from 'react';
import './App.css';
import Map from './components/Map'
import GroundOverlay from './components/GroundOverlay';
function App() {
const [bounds, setBounds] = useState({});
return (
<div className="App">
<Map
zoom={12}
center={{ lat: 40.740, lng: -74.18 }}
events={{ onBoundsChanged: arg => setBounds(arg) }}
>
<GroundOverlay
url='https://www.lib.utexas.edu/maps/historical/newark_nj_1922.jpg'
bounds={{
north: 40.773941,
south: 40.712216,
east: -74.12544,
west: -74.22655
}}
opacity={0.5}/>
</Map>
</div>
);
}
export default App;
В useGoogleMap
custom hook, events
используется для добавления слушателей к объекту map
:
import { useEffect, useState, useRef } from "react";
import GoogleMapsApiLoader from "google-maps-api-loader";
const apiKey = "AIzaSyCVBthtEmWi0Ul8mejDQrBlOULXB1kTB3I";
const eventsMapping = {
onCenterChanged: ["center_changed", map => map.getCenter()],
onBoundsChanged: ["bounds_changed", map => map.getBounds()]
};
export default function useGoogleMap({ zoom, center, events }) {
const [mapState, setMapState] = useState({ loading: true });
const mapRef = useRef();
useEffect(() => {
GoogleMapsApiLoader({ apiKey }).then(google => {
const map = new google.maps.Map(mapRef.current, { zoom, center });
Object.keys(events).forEach(eventName =>
map.addListener(eventsMapping[eventName][0], () =>
events[eventName](eventsMapping[eventName][1](map))
)
);
setMapState({ maps: google.maps, map, loading: false });
});
}, []);
return { mapRef, ...mapState };
}
Так что, как я понимаю, в этом случае этот код должен делать
map.addListener('bounds_changed', setBounds(map.getBounds()))
В таком случае я ожидаю, что переменная состояния bounds
компонента App
должна обновляться всякий раз, когда я перетаскиваю карту.
Однако это не то, что я наблюдаю в Reactинструменты отладчика.Там состояние компонента App
выглядит пустым:
![enter image description here](https://i.stack.imgur.com/xLAwy.jpg)
Короче, мне не ясно, что такое events
реквизит Map
компонента на самом деле?Почему я не вижу bounds
в состоянии компонента App
?
Обновление
Кажется, что 'Hooks' -> 'State' в инструментах отладчика React делаетна самом деле представляют собой состояние bounds
.Однако остается вопрос: почему он продолжает отображать пустой объект, а границы не меняются, когда я перетаскиваю карту?