Javascript 如何在react传单v.3.x中单击标记时动态更改地图缩放?
我试图找到很多关于这方面的东西,但我无法让它工作。我想要的是当点击标记地图在那个位置的中心,并得到完全的缩放。例如,我在美国各地总共有23个标记,初始地图缩放为4。我想要的是,若用户点击地图上的标记,那个么地图中心将变为那个标记lat,lng,并从4放大到14。标记已渲染我不希望在函数MyMapComponent中渲染标记。它来自API数据。不知道该怎么做。我尝试了useMapEvents,但它在map click上工作,而不是marker click,如果我使用markerseventHandlersclick,我无法调用mapuseMapEvents来设置lat、lng和更改缩放 这是我的密码:Javascript 如何在react传单v.3.x中单击标记时动态更改地图缩放?,javascript,reactjs,leaflet,react-leaflet,Javascript,Reactjs,Leaflet,React Leaflet,我试图找到很多关于这方面的东西,但我无法让它工作。我想要的是当点击标记地图在那个位置的中心,并得到完全的缩放。例如,我在美国各地总共有23个标记,初始地图缩放为4。我想要的是,若用户点击地图上的标记,那个么地图中心将变为那个标记lat,lng,并从4放大到14。标记已渲染我不希望在函数MyMapComponent中渲染标记。它来自API数据。不知道该怎么做。我尝试了useMapEvents,但它在map click上工作,而不是marker click,如果我使用markerseventHand
function MyMapComponent() {
const map = useMapEvents({
click: () => {
let data = {lat: 46.8835319, lng: -114.0348327}
map.flyTo(data, 18)
}
})
return null}
上面的代码是我需要改变地图中心和缩放
<div className="project-view-section">
<MapContainer bounds={outerBounds} center={[37.2755, -104.6571]} zoom={mapOptions.zoom} scrollWheelZoom={false}>
<MyMapComponent />
<LayersControl position="topright">
<LayersControl.BaseLayer checked name="Mapbox Satellite">
<TileLayer
url={'https://api.mapbox.com/styles/v1/mapbox/satellite-v9/tiles/256/{z}/{x}/{y}@2x?access_token='+MAPBOX_TOKEN}
attribution="Map data © <a href="https://www.mapbox.com/">Mapbox</a>"
/>
</LayersControl.BaseLayer>
<LayersControl.BaseLayer name="Mapbox Streets">
<TileLayer
url={'https://api.mapbox.com/styles/v1/mapbox/streets-v11/tiles/256/{z}/{x}/{y}@2x?access_token='+MAPBOX_TOKEN}
attribution="Map data © <a href="https://www.mapbox.com/">Mapbox</a>"
/>
</LayersControl.BaseLayer>
</LayersControl>
<MarkerClusterGroup>
{
state.markersData.map((element, index) =>
<Marker
key={index}
marker_index={index}
position={element}
icon={icon}
eventHandlers={{click: () => {test()},}}>
</Marker>
)
}
</MarkerClusterGroup>
</MapContainer>
</div>
{
state.markersData.map((元素,索引)=>
{test()},}}>
)
}
有什么方法可以做到这一点吗?您应该使用
eventHandlers
prop-on-Marker并收听click-event。然后使用本地传单的代码:map.setView(coords,zoom)
函数标记({data}){
const map=useMap();
返回(
数据长度>0&&
data.map((标记、索引)=>{
返回(
{
map.setView(
[
marker.geometry.坐标[1],
marker.geometry.coordinates[0]
],
14
);
}
}}
键={index}
位置={{
lat:marker.geometry.coordinates[1],//您的api结构
lng:marker.geometry.coordinates[0]//您的api结构
}}
icon={icon}
>
{marker.properties.label}
);
})
);
}
然后将标记comp用作MapContainer子级
function Markers({ data }) {
const map = useMap();
return (
data.length > 0 &&
data.map((marker, index) => {
return (
<Marker
eventHandlers={{
click: () => {
map.setView(
[
marker.geometry.coordinates[1],
marker.geometry.coordinates[0]
],
14
);
}
}}
key={index}
position={{
lat: marker.geometry.coordinates[1], // your api structure
lng: marker.geometry.coordinates[0] // your api structure
}}
icon={icon}
>
<Popup>
<span>{marker.properties.label}</span>
</Popup>
</Marker>
);
})
);
}