首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建动态<Marker> <Popup>实例的React-leaflet问题

创建动态<Marker> <Popup>实例的React-leaflet问题
EN

Stack Overflow用户
提问于 2021-04-20 22:25:37
回答 1查看 149关注 0票数 0

我想动态创建一个react-leaflet对象。正常的leaflet对象可以工作,但react-leaflet不能。代码示例:https://codesandbox.io/s/show-problem-react-leaflet-marker-popup-object-hm0o8?file=/src/MapView.js

左键单击显示leaflet对象的所需行为,然后右键单击react-leaflet的问题。

问题代码:

代码语言:javascript
复制
var lat = e.latlng.lat;
var lon = e.latlng.lng;
// create popup contents
    
// use <Marker> from react-leaflet
var newMarker = <Marker position={[lat, lon]}>
  {/* use Edit Popup */}
  <Popup editable open>   
    Your stylable content here.
  </Popup>
</Marker>;
    
// Problem addTo(map) 
newMarker.addTo(map);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-20 23:46:47

newMarker是一个react元素。不能对其调用leaflet方法addTo,因为它不是leaflet L.Marker实例。

如果您希望能够通过react管理标记,则需要保留一个状态变量,该变量是一个坐标数组。单击地图时,可以将坐标添加到该数组中,然后从中呈现一系列<Marker />元素。

在事件处理程序中,您只需捕获单击的位置并将其传递给回调setMarkers

代码语言:javascript
复制
function MyRightClickEventHandler({ setMarkers }) {
  useMapEvents({
    contextmenu: (e) => {
      setMarkers(e.latlng);
    }
  });
  return null;
}

setMarkers是主MapView组件上setState的回调,它将latlng添加到状态变量中,该变量包含一个latlngs数组

代码语言:javascript
复制
// inside you'r MapContainer:
<MyRightClickEventHandler
  setMarkers={(markers) =>
    this.setState({ 
      MarkerArray: [...this.state.MarkerArray, markers] 
    })
  }
/>

然后映射到该状态变量中的latlng(如果有):

代码语言:javascript
复制
{this.state.MarkerArray &&
  this.state.MarkerArray.map((latlng) => (
    <Marker position={latlng}>
      <Popup editable removable>
        Thanks for using my editable popup plugin!
      </Popup>
    </Marker>
  ))}

Working codesandbox

请注意,如果您要在从数组动态呈现的可编辑弹出窗口上使用editableremovableopen道具,请务必阅读我在using editable popups rendered from a dynamic state array上的部分-如果您不小心,它可能会变得混乱。如果你遇到问题,请随时在评论中提问。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67180882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档