反应传单标记点击的任意功能

时间:2016-12-01 02:15:49

标签: reactjs leaflet react-leaflet

React-leaflet很好地提供了将内容放在标记的Popup内的能力。

例如在我的例子中:

            <Marker position={[item.lat, item.lng]} key={item.machineid}>
              <Popup maxWidth={720}>
                <ItemGrid machineid={item.machineid}
                          username={this.props.username}/>
              </Popup>
            </Marker>

但是,如果这个内容太大,可能会很笨拙,特别是在移动设备上。我希望点击Marker时激活(bootstrap)Modal界面。有没有办法在react-leaflet中做到这一点?

4 个答案:

答案 0 :(得分:1)

我发现了一种在点击标记时执行任意操作的黑客行为。 (1)保持弹出窗口,但让它的内容做你喜欢的任何事情(例如,通过defaut打开模态)和(2)用CSS隐藏弹出窗口的容器div。

就我而言,它看起来像这样: 地图视图保持不变:

<Marker position={[item.lat, item.lng]} key={item.machineid}>
    <Popup maxWidth={720}>
      <ItemGrid machineid={item.machineid}
                         username={this.props.username}/>
    </Popup>
</Marker>

然后,之前处于弹出窗口的ItemGrid会更改为包含模式。 (这里我们使用reactstrap组件并在组件安装时将模态设置为true。):

class ItemGrid extends Component {
  constructor(props){
    super(props);
     this.state = {modal:false}
    this.toggle = this.toggle.bind(this);
  }

  toggle() {
    this.setState({
      modal: !this.state.modal
    });
  }

  componentDidMount() {
    this.setState({modal:true})
  }

  render()  {
    return (
      <div>
      <Modal isOpen={this.state.modal} toggle={this.toggle} className={this.props.className}>
        <ModalHeader toggle={this.toggle}>Modal Header</ModalHeader>
        <ModalBody>
          {ContentThatWasPreviouslyInPopup}
        </ModalBody>
      </Modal>
    </div>

最后在传单CSS中:

.leaflet-container a.leaflet-popup-close-button {
    position: absolute;
    top: 0;
    right: 0;
    padding: 8px 8px 0 0;
    text-align: center;
    width: 0px;
    height: 0px;
    font: 0px/0px Tahoma, Verdana, sans-serif; //DANGEROUS HACK
    color: #c3c3c3;
    text-decoration: none;
    font-weight: bold;
    background: transparent;
    }

.leaflet-popup-content-wrapper {
    padding: 1px;
    text-align: left;
    border-radius: 12px;
    width: 0px // DANGEROUS HACK
    }

答案 1 :(得分:1)

更新: 发生的行为#

在Marker组件中使用eventHandlers侦听器功能:

<Marker
  position={[50.5, 30.5]}
  eventHandlers={{
    click: (e) => {
      console.log('marker clicked', e)
    },
  }}
/>

答案 2 :(得分:0)

根据react-leaflet docs

  

Leaflet公开自己的事件,与React不同。您可以使用React-Leaflet通过在以on为前缀的属性中添加回调来收听它们。例如:<Map onMoveend={this.handleMoveend}>...</Map>

     

检查Leaflet的文档中与每个组件相关的事件。

因此,我们可以使用Leaflet的本机onClick DOM event

对于react-leaflet,它看起来像这样:

import React, { Component } from "react"
import { Map as LeafletMap, TileLayer, Marker } from "react-leaflet"

class Map extends Component {
  handleClick = event => {
    const { lat, lng } = event.latlng
    console.log(`Clicked at ${lat}, ${lng}`)
  }

  render () {
    return (
      <LeafletMap center={[52.5134, 13.4225]} zoom={13}>
        <TileLayer attribution={attribution} url={url}>
          <Marker
            position={[52.5134, 13.4225]}
            onClick={this.handleClick} // <-- call handleClick()
          />
        </TileLayer>
      </LeafletMap>
    )
  }
}

export default Map

答案 3 :(得分:0)

对于想要传递参数的人,您应该使用:

<Marker
  position={[50.5, 30.5]}
  data="FooBar"
  eventHandlers={{
    click: (e) => {
      console.log(e.target.options.data);  // will print 'FooBar' in console
    },
  }}
/>