【问题标题】:How should I use OverlappingMarkerSpiderfier with react-leaflet?我应该如何将 OverlappingMarkerSpiderfier 与 react-leaflet 一起使用?
【发布时间】:2019-08-26 12:30:25
【问题描述】:

我正在将现有的 Web 应用程序重写为 React 应用程序。在原版中,leafletOverlappingMarkerSpiderfier 一起用于地图 创建地图标记之间的区别。在新应用中,我使用的是react-leaflet。使用的所有其他插件都可以做出反应,但我想为 OverlappingMarkerSpiderfier 创建一个传单自定义组件。创建这个组件时我有点不知所措。

理想情况下,我想在 React 渲染循环中这样调用组件。

return (
  <Map>
    <Spiderfy >
      <Marker>
        <Popup>
        </Popup>
      </Marker>
      <Marker>
        <Popup>
        </Popup>
      </Marker>
    </Spiderfy>
  </Map>
  )

OverlappingMarkerSpiderfier 示例显示了一个正在创建的对象实例,一个事件监听器被添加到地图中,所有的标记都被添加到 OMS 实例中。我试过把它挤进一个 ReactLeaflet 类,但到目前为止没有成功。

class _Spiderfy extends MapLayer {

    constructor(props) {
        super(props)
        this.oms = null
    }

    createLeafletElement ({children, leaflet: {map, ...props}})  {
        let newLayer = L.featureGroup()
        this.oms = new OverlappingMarkerSpiderfier(map);

        var popup = new L.Popup();
        this.oms.addListener('click', function(marker) {
            popup.setContent(marker.desc);
            popup.setLatLng(marker.getLatLng());
            map.openPopup(popup);
        });

        this.oms.addListener('spiderfy', function(markers) {
            map.closePopup();
          });

        return newLayer
    }
}

export default withLeaflet(_Spiderfy);

这是我目前拥有的包装器。它呈现子项(所有标记及其弹出窗口),但单击地图时不会执行事件侦听器。我也不知道如何从子列表中获取 Marker 对象并将它们添加到 oms 实例中。

对于创建这个类或其他类似的库有什么建议吗?

【问题讨论】:

    标签: javascript react-leaflet


    【解决方案1】:

    你已经足够接近了,这是一个更新的组件版本,它演示了如何将 OverlappingMarkerSpiderfier-Leaflet 集成到 React-Leaflet

    class Spiderfy extends MapLayer {
    
      createLeafletElement(props) {
        const { map } = props.leaflet;
        this.oms = this.createOverlappingMarkerSpiderfier(map);
        const el = L.layerGroup();
        this.contextValue = { ...props.leaflet, layerContainer: el };
        return el;
      }
    
      componentDidMount() {
        super.componentDidMount();
        this.leafletElement.eachLayer(layer => {
          if (layer instanceof L.Marker) {
            this.oms.addMarker(layer);
          }
        });
      }
    
      createOverlappingMarkerSpiderfier(map) {
        const oms = new window.OverlappingMarkerSpiderfier(map);
        oms.addListener("spiderfy", markers => {
          markers.forEach(m => m.closePopup())//force to close popup 
          if (this.props.onSpiderfy) this.props.onSpiderfy(markers);
        });
        oms.addListener("unspiderfy", markers => {
          if (this.props.onUnspiderfy) this.props.onUnspiderfy(markers);
        });
        oms.addListener("click", marker => {
          if (this.props.onClick) this.props.onClick(marker);
        });
        return oms;
      }
    }
    
    export default withLeaflet(Spiderfy);
    

    缺件清单:

    • 通过OverlappingMarkerSpiderfier.addMarker 方法从标记列表初始化
    • 事件处理程序实现

    还有here is a demo供你参考

    【讨论】:

    • 是否可以使用通常用于平移 like so 的 FeatureGroup?它目前出错了。
    • 嘿@LouisChristopher,错误似乎是由overlapping-marker-spiderfier-leaflet引起的,也许您可​​以就此提出一个单独的问题?
    • 好的,感谢您的快速回复,我已经发布了separate question。 :)
    • 是否可以将它与最新的 react-leaflet v3 一起使用? Error in /~/Spiderfy.js (9:40) Class extends value undefined is not a constructor or null 谢谢
    猜你喜欢
    • 1970-01-01
    • 2019-06-30
    • 2020-09-24
    • 2019-05-31
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    相关资源
    最近更新 更多