禁用或启用地图拖动

Disable or enable map dragging

我使用的是react-leaflet map,我用状态改变了很多地图属性,但是当使用状态改变拖动属性时它不起作用。

<Map
                    ref={(map) => { this.map = map}}
                    center={this.state.center ? this.state.center : this.getCalculatedCenterFromState()}
                    zoom={this.state.zoom ? this.state.zoom : this.getCalculatedZoomFromState()}
                    minZoom={this.state.minZoom ? this.state.minZoom : null}
                    maxZoom={this.state.maxZoom}
                    attributionControl={false}
                    doubleClickZoom={false}
                    zoomControl={false}
                    onZoomEnd={this.handleZoomEnd}
                    onMoveEnd={this.handleMoveEnd}
                    dragging={!this.state.smallScreen}
                    tap={!this.state.smallScreen}
                    renderer={this.mapService.getRendererType()}
                />

我正在用这个方法改变状态

/**
     * Shows or hides seats depending on Zoom level.
     */
    handleZoomEnd = () =>
    {
        if (this.map && this.map.leafletElement) {
            let zoomLevel = this.map.leafletElement.getZoom();

            this.setState({
                zoom: zoomLevel,
            });

            if (zoomLevel >= 0) {
                this.setState({draggable: true});
            } else {
                this.setState({draggable: false});
            }

            console.log(this.state.draggable);
        }
    };

问题是状态正在改变但拖动不受影响。 其他选项受状态变化的影响,但拖动除外。 有人能看到我在这里想念的东西吗?

不确定这是否是错误,但您在不同行的同一函数中两次更改状态,并且状态更改是一个异步过程,因此您可能遇到了问题。您应该同时设置这两种状态。

if (this.map && this.map.leafletElement) {
   let zoomLevel = this.map.leafletElement.getZoom();
   if (zoomLevel >= 0) {
      this.setState({draggable: true, zoom: zoomLevel});
   } else {
      this.setState({draggable: false, zoom: zoomLevel});
   }
}

你的 objective 到底是什么?您想根据地图的缩放使地图可拖动或不可拖动吗?

编辑: 你可以尝试在componentDidUpdate中控制地图可拖动。这样您就可以将缩放操作与可拖动操作分开(setZoom 应该只理想地更新缩放状态)。

componentDidUpdate(prevProps, prevState) {
    if (prevState.zoomLevel !== this.state.zoomLevel) {
      if (this.state.zoomLevel >= 0) {
        this.setState({ draggable: true });
      } else {
        this.setState({ draggable: false });
      }
    }
  }

  handleZoomEnd = () => {
    if (this.map && this.map.leafletElement) {
      let zoomLevel = this.map.leafletElement.getZoom();

      this.setState({ zoom: zoomLevel });
    }
  };