如何动态地向React-Leaflet映射添加标记?
我想在用户点击地图时添加新标记。我无法使它工作。
import React, { Component } from 'react' import { render } from 'react-dom'; import Control from 'react-leaflet-control'; import { Map, Marker, Popup, TileLayer, ZoomControl, ScaleControl } from 'react-leaflet'; import './Points.scss' export default class PointsMap extends Component { state = { lat: 50.2, lng: 30.2, zoom: 13, } handleClick = (e) => { this.addMarker(); } addMarker() { // A) Following raises error: var marker3 = L.marker([50.5, 30.5]).addTo(this.refs.map); // B) With following marker doesn't appear on map: const position2 = [50,30]; <Marker map={this.refs.map} position={position2} /> } render () { const position = [this.state.lat, this.state.lng] return ( <Map ref='map' center={position} zoom={this.state.zoom} onClick= {this.handleClick} > <ZoomControl position="topright" /> <ScaleControl position="bottomright" /> <TileLayer attribution='© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors' url='http://{s}.tile.osm.org/{z}/{x}/{y}.png' /> <Marker map={this.refs.map} position={position} > <Popup> <span>A pretty CSS3 popup. <br /> Easily customizable.</span> </Popup> </Marker> </Map> ) } }
在 addMarker()中, 我尝试添加新标记。我尝试通过两种方式做到这一点:
一个)
var marker3 = L.marker([50.5, 30.5]).addTo(this.refs.map);
它引发错误:
Uncaught TypeError: map.addLayer is not a function at NewClass.addTo (leaflet-src.js:3937) at PointsMap.addMarker (Points.js?12f5:54)
B)
const position2 = [50,30]; <Marker map={this.refs.map} position={position2} />
它不会添加任何新标记,也不会引发任何错误。
您知道如何动态添加/删除标记吗?
为了最大程度地利用 react -leaflet,您应该考虑如何设计地图呈现方式,以使react生命周期能够处理点击和标记显示。React- leaflet可为您处理几乎所有的传单工作。
您应该使用组件的状态或道具来跟踪组件正在显示的标记。因此,L.marker您应该只渲染一个新<Marker>组件,而不是手动调用。
L.marker
<Marker>
点击地图后,以下是添加标记的反应方式:
class SimpleExample extends React.Component { constructor() { super(); this.state = { markers: [[51.505, -0.09]] }; } addMarker = (e) => { const {markers} = this.state markers.push(e.latlng) this.setState({markers}) } render() { return ( <Map center={[51.505, -0.09]} onClick={this.addMarker} zoom={13} > <TileLayer attribution='© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors' url='http://{s}.tile.osm.org/{z}/{x}/{y}.png' /> {this.state.markers.map((position, idx) => <Marker key={`marker-${idx}`} position={position}> <Popup> <span>A pretty CSS3 popup. <br/> Easily customizable.</span> </Popup> </Marker> )} </Map> ); } }
这是一个jsfiddle:https ://jsfiddle.net/q2v7t59h/413/