1

我的版本:反应:16.0.0 反应传单:1.6.6

我试图将图层控制器添加到我的地图中。有两层,每层都包含多个标记。这是我尝试做的一个例子。

import React, { Component }  from 'react'
import { render } from 'react-dom'
import { Map, TileLayer, Circle, Marker, Popup, LayersControl, LayerGroup } from 'react-leaflet'

class SimpleExample extends Component {
  constructor() {
    super()
    this.state = {
      lat: 51.505,
      lng: -0.09,
      zoom: 3,
      radius: 0
    };
    this.onClick1 = this.onClick1.bind(this);
    this.onClick2 = this.onClick2.bind(this);

  }

  getRandomArbitrary(min, max) {
    return Math.random() * (max - min) + min;
  }

  onClick1(){
    this.setState({radius: this.getRandomArbitrary(100, 800)});
  }

  onClick2(){
    this.setState({radius: 0});
  }

  renderFirst() {
    var result = [];
    for(var i =0; i < 10; i++) {
     result.push(
       <Marker position={[i,i]}>
         <Popup>
           <span>A pretty CSS3 popup. <br/> Easily customizable.</span>
         </Popup>
       </Marker>
    )}
    return result;
  }

  renderSecond() {
   return <MyLayer latlng={[1, 10]} radius={this.state.radius}/>
  }

  render() {
    return (
      <div>
        <button name="btn" onClick={this.onClick1}>Click me</button>
        <button name="btn" onClick={this.onClick2}>Then me</button>

      <Map center={[0, 0]} zoom={this.state.zoom}>
        <TileLayer
          attribution='&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
          url='http://{s}.tile.osm.org/{z}/{x}/{y}.png'
        />
        <LayersControl position='topleft'>
           <LayersControl.Overlay checked name="first layer">
            {this.renderFirst()}
          </LayersControl.Overlay>
          <LayersControl.Overlay checked name="second layer">
            {this.renderSecond()}
          </LayersControl.Overlay>
        </LayersControl>


      </Map>
        </div>
    );
  }
}


class MyLayer extends Component {
  constructor(props) {
    super(props);
  }


  render() {
    if (this.props.radius === 0) {
      return <LayerGroup/>;
    }
    return (<LayerGroup>
               <Circle center={this.props.latlng} fillColor="red" radius={this.props.radius}/>
            </LayerGroup>);
  }

}


render(<SimpleExample />, document.getElementById('container')) 

在此处运行代码:https ://www.webpackbin.com/bins/-Kvmu5PPSjeS4lY-qe_E

问题是渲染后,列表中应该只有两层。目前,我看到每个图层中的每个项目都显示在列表中。我认为原因是因为我将标记推送到数组并返回它。但是,我不确定我可以采取什么解决方法来仅显示每层一个列表。

在此处输入图像描述

4

1 回答 1

6

事实证明,我需要将我的标记数组包装在 LayerGroup 中,现在它可以工作了。

<LayersControl position='topleft'>
  <LayersControl.Overlay checked name="first layer">
    <LayerGroup>
      {this.renderFirst()}
    </LayerGroup>
</LayersControl.Overlay>
  <LayersControl.Overlay checked name="second layer">
    {this.renderSecond()}
  </LayersControl.Overlay>
</LayersControl>

在此处输入图像描述

于 2017-10-06T21:07:56.267 回答