javascript - react-leaflet LayersControl 在列表中生成重复项

标签 javascript reactjs leaflet react-leaflet

我的版本: react :16.0.0 react 传单:1.6.6

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

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

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

enter image description here

最佳答案

事实证明,我需要将我的标记数组包装在 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>

enter image description here

关于javascript - react-leaflet LayersControl 在列表中生成重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46613795/

相关文章:

javascript - HTML5 输入范围 : change color of runnable-track up to current value

javascript - 如何调试和修复这个问题?

javascript - 当使用 ajax 从其他页面加载内容时,Angularjs 代码不起作用

javascript - TS2604 : JSX elemy type '' does not have any construct or call signatures

javascript - 我如何将网格线包装到 kendo ui 网格中的限制

node.js - Stripe - 创建或更新订阅时 PaymentIntent 为空

reactjs - 为什么子组件没有从 React Native 中的父组件接收更新值?

Leafletjs - 将弹出窗口移动到侧面板

javascript - Leaflet 1.0 升级 spliceLatLngs 替代方案?

javascript - 创建网络 map 应用程序。 Leaflet 还是 OpenLayers?