0

这是我的组件

import React, { PropTypes } from 'react';
import { MapLayer } from 'react-leaflet';
import L from 'leaflet';
import './collision.js';

export default class LayerGroupCollision extends MapLayer {
  static childContextTypes = {
    layerContainer: PropTypes.shape({
      addLayer: PropTypes.func.isRequired,
      removeLayer: PropTypes.func.isRequired,
    })
  }

  getChildContext() {
    return {
      layerContainer: this.leafletElement,
    }
  }
  createLeafletElement() {
    var t = L.layerGroup.collision({ margin: 20 }, this.getOptions());
    this.layerContainer.addLayer(t);
    return t;
  }

  componentDidMount() {
    const {map} = this.context;
    map.on("zoomend", this._onZoomEnd);
  }

  componentWillUnmount() {
    const {map} = this.context;
    map.off("zoomend", this._onZoomEnd);
  }
}

但这不起作用,我只是得到标记。在缩放时我得到错误

未捕获的类型错误:无法读取未定义的属性“调用”

at NewClass.fire (leaflet-src.js:587)
at NewClass._moveEnd (leaflet-src.js:3432)
at NewClass.<anonymous> (leaflet-src.js:3869)

有什么建议吗?

4

2 回答 2

1

您没有_onZoomEnd在您的类中定义函数,而您从中扩展的 MapLayer 类也没有。但是在你map.on("zoomend", this._onZoomEnd)提供map.off("zoomend", this._onZoomEnd)它作为 zoomend 事件的回调。然后它无法调用 _onZoomEnd 因为它是未定义的

于 2017-03-15T18:32:40.433 回答
0

插件本身负责定义侦听器,因此您可以省略该代码。下面的代码应该足以将 Leaflet.LayerGroup.Collision 插件包装在 React 组件中。由于您收到错误消息的原因,Alex 的评论是正确的。

import React from 'react';
import { func, shape } from 'prop-types';
import { MapLayer } from 'react-leaflet';
import 'leaflet.layergroup.collision';
import L from 'leaflet';

export default class LayerGroupCollision extends MapLayer {
  static childContextTypes = {
    layerContainer: shape({
      addLayer: func.isRequired,
      removeLayer: func.isRequired,
    }),
  }

  getChildContext() {
    return {
      layerContainer: this.leafletElement,
    };
  }

  createLeafletElement() {
    const layerGroup = L.layerGroup.collision({ margin: 4 });
    this.layerContainer.addLayer(layerGroup);
    return layerGroup;
  }
}
于 2017-10-20T20:37:28.963 回答