You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React ZoomToLocation组件仅返回JSON最后一项无法遍历所有项

问题根源
  • react-leaflet的useMapEvents钩子针对单个<MapContainer>实例只会全局注册一次事件监听,在循环渲染的每个<Marker>下都挂载<ZoomToLocation>组件时,后续组件注册的click事件会直接覆盖之前注册的回调
  • 最后一次注册的回调闭包捕获的是数组最后一项的经纬度,所以不管点哪个标记,触发的都是最后一个点位的定位逻辑
修正方法

推荐直接给<Marker>绑定点击事件,不需要额外嵌套自定义组件,逻辑更直观:

function MyMap() {
  return (
    <MapContainer>
      {loc.map(loc => (
        <Marker
          key={loc.properties.id}
          position={[loc.properties.y, loc.properties.x]}
          eventHandlers={{
            click: (e) => {
              e.target._map.setView([loc.properties.y, loc.properties.x], 15)
            }
          }}
        />
      ))}
    </MapContainer>
  )
}

如果要保留独立的<ZoomToLocation>组件,注意只能在MapContainer下全局挂载一次,不要放在循环内部:

const ZoomToLocation = () => {
  const map = useMapEvents({
    click(e) {
      // 从点击事件的源marker上取position属性即可
      const markerPos = e.sourceTarget.options.position
      if (markerPos) map.setView(markerPos, 15)
    }
  })
  return null
}

function MyMap() {
  return(
    <MapContainer>
      {/* 全局只挂载一次 */}
      <ZoomToLocation />
      {loc.map(loc => (
        <Marker 
          key={loc.properties.id} 
          position={[loc.properties.y, loc.properties.x]}
        />
      ))}
    </MapContainer>
  )
}

内容的提问来源于stack exchange,提问作者Gatnik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 08:54:19