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

react-leaflet-draw获取坐标后useState设置状态滞后不生效问题

React+react-leaflet-draw EditControl状态更新滞后解决方案

问题本质

React的状态更新是异步批量执行的,调用setCoords后不会立即修改当前渲染闭包中的coords变量,需要等待当前回调函数执行完成后触发组件重渲染,下一次渲染时才能拿到更新后的coords值。你在created回调内setCoords后立刻打印的coords始终是当前渲染周期的旧值,因此会出现更新滞后一步的现象。

修复方案

  • 若需要获取更新后的状态做后续处理,通过useEffect监听coords变化触发逻辑:
import { useEffect } from 'react';

function MyMap({ floorsByBuilding }: MyMapProps) {
  const [coords, setCoords] = useState<any[]>([]);

  // 监听coords变化,拿到最新值
  useEffect(() => {
    console.log("最新Coords:", coords);
    // 此处写依赖最新coords的逻辑,比如提交接口、坐标计算等
  }, [coords]);

  const created = (e) => {
    const coordsList = e.layer.editing.latlngs[0][0];
    console.log("coordsList:", coordsList);
    // 存入状态时建议深拷贝,避免leaflet内部修改原对象污染状态
    setCoords(coordsList.map(item => ({...item})));
  };

  return (
    <div className="mapview">
      <div className="myMap">
        <Map center={[0, 0]} zoom={1}>
          <FeatureGroup>
            <EditControl
              position="topright"
              draw={{
                rectangle: false,
                circle: false,
                circlemarker: false,
                polyline: false,
              }}
              onCreated={created}
            />
          </FeatureGroup>
        </Map>
      </div>
    </div>
  );
}
  • 若仅需要在created回调内使用刚生成的坐标,直接使用已经拿到的coordsList变量即可,无需从状态中取值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 11:36:01