如何将数据绑定到 React Leaflet 中的标记点击?
How to bind data to a Marker click in React Leaflet?
我正在尝试绑定数据,这样当我点击一个标记时,我可以从我正在使用的 json 中名为 "station_id" 的字段中检索一个值,特别是一个 ID。目前我正在控制台记录 event.target,点击制造商时:
markerClick = (e) =>{
console.log(e.target);
}
let markers =null;
if(this.props.showStations) {
markers = (
this.props.stations.data.stations.map((station) =>
<Marker
position={[station.lat, station.lon]}
onClick={this.markerClick.bind(this, station)}>
</Marker>
)
)
}
我认为解决此问题的方法是绑定 markerClick 函数,但我不确定如何正确执行此操作。下面是我的代码:
App.js
import React, { Component } from 'react';
import Leaf from './components/Leaf';
class App extends Component {
constructor(props) {
super(props);
this.state = {
viewport: {
height: "100vh",
width: "100vw",
latitude: 40.7128,
longitude: -74.0060,
zoom: 10
},
latitude: 40.7128,
longitude: -74.0060,
zoom: 10,
stations: [],
showStations: false,
selectedStation: null,
userLocation: {}
};
}
componentDidMount() {
const request = async()=> {
await fetch('https://gbfs.citibikenyc.com/gbfs/en/station_information.json')
.then(res => res.json())
.then(res=>
this.setState({stations: res, showStations: true}))
}
request();
}
checkData=()=>{
console.log(this.state.stations)
this.state.stations.data.stations.map(e=>{
console.log(e)
})
}
render() {
return (
<div>
<button onClick={this.checkData}>click me</button>
<Leaf
viewport={this.state.viewport}
stations={this.state.stations}
showStations={this.state.showStations}/>
</div>
);
}
}
export default App;
Leaf.js
import React, {Component} from 'react';
import { Map, TileLayer, Marker, Popup } from 'react-leaflet';
//import './leaf.css'
//import InfoBox from './InfoBox';
import { Button } from 'react-bootstrap';
//import Search from './Search';
//import Match from './Match';
//import Modal from './Modal';
//import L from 'leaflet';
//import Routing from "./RoutingMachine";
//import { Row, Col, Grid, Container } from 'react-bootstrap';
//import ErrorBoundary from '../ErrorBoundary/ErrorBoundary'
class Leaf extends Component {
checkData=()=>{
this.props.stations.data.stations.map(e=>{
console.log(e)
})
}
markerClick = (e) =>{
console.log(e.target);
}
render() {
let markers =null;
if(this.props.showStations) {
markers = (
this.props.stations.data.stations.map((station) =>
<Marker
position={[station.lat, station.lon]}
onClick={this.markerClick.bind(station)}>
</Marker>
)
)
}
const position = [this.props.viewport.latitude, this.props.viewport.longitude]
//const position = [40.7484, -73.9857]
return (
<div>
<button onClick={this.checkData}>check props</button>
<Map center={position} zoom={14}>
<TileLayer
attribution='&copy <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
/>
{markers}
<Marker position={position}>
<Popup>
A pretty CSS3 popup. <br /> Easily customizable.
</Popup>
</Marker>
</Map>
</div>
);
}
}
export default Leaf;
我不认为你想要 bind
。 bind
旨在用于为函数提供对 this
的访问权限。普通变量应通过以下方法之一使用。
你可以将你的函数内联到这个:
onClick={() => this.markerClick(station)}
或者更改函数的签名并将其柯里化为:
markerClick = (station) => (e) =>{
console.log(station);
}
....
onClick={this.markerClick(station)}
使用Marker组件内部的eventHandlers函数:
<Marker
position={[50.5, 30.5]}
eventHandlers={{
click: (e) => {
console.log('marker clicked', e)
},
}}
/>
我正在尝试绑定数据,这样当我点击一个标记时,我可以从我正在使用的 json 中名为 "station_id" 的字段中检索一个值,特别是一个 ID。目前我正在控制台记录 event.target,点击制造商时:
markerClick = (e) =>{
console.log(e.target);
}
let markers =null;
if(this.props.showStations) {
markers = (
this.props.stations.data.stations.map((station) =>
<Marker
position={[station.lat, station.lon]}
onClick={this.markerClick.bind(this, station)}>
</Marker>
)
)
}
我认为解决此问题的方法是绑定 markerClick 函数,但我不确定如何正确执行此操作。下面是我的代码:
App.js
import React, { Component } from 'react';
import Leaf from './components/Leaf';
class App extends Component {
constructor(props) {
super(props);
this.state = {
viewport: {
height: "100vh",
width: "100vw",
latitude: 40.7128,
longitude: -74.0060,
zoom: 10
},
latitude: 40.7128,
longitude: -74.0060,
zoom: 10,
stations: [],
showStations: false,
selectedStation: null,
userLocation: {}
};
}
componentDidMount() {
const request = async()=> {
await fetch('https://gbfs.citibikenyc.com/gbfs/en/station_information.json')
.then(res => res.json())
.then(res=>
this.setState({stations: res, showStations: true}))
}
request();
}
checkData=()=>{
console.log(this.state.stations)
this.state.stations.data.stations.map(e=>{
console.log(e)
})
}
render() {
return (
<div>
<button onClick={this.checkData}>click me</button>
<Leaf
viewport={this.state.viewport}
stations={this.state.stations}
showStations={this.state.showStations}/>
</div>
);
}
}
export default App;
Leaf.js
import React, {Component} from 'react';
import { Map, TileLayer, Marker, Popup } from 'react-leaflet';
//import './leaf.css'
//import InfoBox from './InfoBox';
import { Button } from 'react-bootstrap';
//import Search from './Search';
//import Match from './Match';
//import Modal from './Modal';
//import L from 'leaflet';
//import Routing from "./RoutingMachine";
//import { Row, Col, Grid, Container } from 'react-bootstrap';
//import ErrorBoundary from '../ErrorBoundary/ErrorBoundary'
class Leaf extends Component {
checkData=()=>{
this.props.stations.data.stations.map(e=>{
console.log(e)
})
}
markerClick = (e) =>{
console.log(e.target);
}
render() {
let markers =null;
if(this.props.showStations) {
markers = (
this.props.stations.data.stations.map((station) =>
<Marker
position={[station.lat, station.lon]}
onClick={this.markerClick.bind(station)}>
</Marker>
)
)
}
const position = [this.props.viewport.latitude, this.props.viewport.longitude]
//const position = [40.7484, -73.9857]
return (
<div>
<button onClick={this.checkData}>check props</button>
<Map center={position} zoom={14}>
<TileLayer
attribution='&copy <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
/>
{markers}
<Marker position={position}>
<Popup>
A pretty CSS3 popup. <br /> Easily customizable.
</Popup>
</Marker>
</Map>
</div>
);
}
}
export default Leaf;
我不认为你想要 bind
。 bind
旨在用于为函数提供对 this
的访问权限。普通变量应通过以下方法之一使用。
你可以将你的函数内联到这个:
onClick={() => this.markerClick(station)}
或者更改函数的签名并将其柯里化为:
markerClick = (station) => (e) =>{
console.log(station);
}
....
onClick={this.markerClick(station)}
使用Marker组件内部的eventHandlers函数:
<Marker
position={[50.5, 30.5]}
eventHandlers={{
click: (e) => {
console.log('marker clicked', e)
},
}}
/>