Cal*_*lum 4 google-maps reactjs
我正在使用react-google-maps文档中发布的聚类地图的股票代码。我正在尝试通过为标记添加click事件来扩展代码,该事件将从API获取标记URL,然后调用window.location以更改页面。
这是从我的API返回的标记之一的示例:
{
id: 1,
name: "Oxford",
slug: "oxford",
lat: 51.752021,
lng: -1.257726,
}
Run Code Online (Sandbox Code Playgroud)
我onMarkerClick向标记添加了一个事件,该方法被正确调用。我对window.location进行了硬编码,然后它被调用,我只是不知道如何获取该值。
我假设我必须与以下示例中的存储方式不同地存储段塞值。我是React的新手,所以我可能缺少一些明显的东西
import React from 'react'
const fetch = require("isomorphic-fetch");
const { compose, withProps, withHandlers } = require("recompose");
const {
withScriptjs,
withGoogleMap,
GoogleMap,
Marker
} = require("react-google-maps");
const { MarkerClusterer } = require("react-google-maps/lib/components/addons/MarkerClusterer");
const MapWithAMarkerClusterer = compose(
withProps({
googleMapURL: "https://maps.googleapis.com/maps/api/js?key=AIzaSyCvakAjEUpqfnucJu-CoClBD1CtTKZUGxQ&v=3.exp&libraries=geometry,drawing,places",
loadingElement: <div style={{ height: 'calc(100vh - 56px)' }} />,
containerElement: <div style={{ height: 'calc(100vh - 56px)' }} />,
mapElement: <div style={{ height: 'calc(100vh - 56px)' }} />,
}),
withHandlers({
onMarkerClustererClick: () => (markerClusterer) => {
console.log('Clicked a cluster')
},
onMarkerClick: () => (marker) => {
// link to post view page
//
//
//
//
//
console.log('Go to the marker post page')
window.location = '/post/oxford';
}
}),
withScriptjs,
withGoogleMap
)(props =>
<GoogleMap
defaultZoom={3}
defaultCenter={{ lat: 12.2637937, lng: 75.947508 }}
>
<MarkerClusterer
onClick={props.onMarkerClustererClick}
averageCenter
enableRetinaIcons
gridSize={60}
>
{props.markers.map(marker => (
<Marker
onClick={props.onMarkerClick}
key={marker.id}
position={{ lat: marker.lat, lng: marker.lng }}
slug={marker.slug}
/>
))}
</MarkerClusterer>
</GoogleMap>
);
class TestMap extends React.PureComponent {
componentWillMount() {
this.setState({ markers: [] })
}
componentDidMount() {
const url = '/api/posts';
fetch(url)
.then(res => res.json())
.then(data => {
this.setState({ markers: data });
});
}
render() {
return (
<MapWithAMarkerClusterer markers={this.state.markers} />
)
}
}
export default TestMap
Run Code Online (Sandbox Code Playgroud)
在这个例子中
<Marker
onClick={props.onMarkerClick}
key={marker.id}
position={{ lat: marker.lat, lng: marker.lng }}
slug={marker.slug}
/>
onMarkerClick: () => (marker) => { //<- event object, not a marker object!
//..
}
Run Code Online (Sandbox Code Playgroud)
特定的Google Maps event对象将传递给onMarkerClick事件处理程序,而不是marker对象。
您可以利用.bind传递marker对象作为参数,如下所示:
<Marker
key={marker.photo_id}
position={{ lat: marker.latitude, lng: marker.longitude }}
onClick={props.onMarkerClick.bind(this,marker)}
/>
Run Code Online (Sandbox Code Playgroud)
然后给出marker对象的结构:
{
id: 1,
name: "Oxford",
slug: "oxford",
lat: 51.752021,
lng: -1.257726,
}
Run Code Online (Sandbox Code Playgroud)
onMarkerClick 事件可以这样初始化:
onMarkerClick: () => (marker) => {
window.location = '/post/' + marker.slug;
}
Run Code Online (Sandbox Code Playgroud)
您可以为标记创建一个自定义组件,并通过其他参数来识别它-例如,id:
import React from 'react';
import {Marker} from 'react-google-maps';
const CustomMarker = (props) => {
const {id} = props;
const onMarkerClick = (evt) => {
console.log(id);
};
return (
<Marker
onClick={onMarkerClick}
{...props}
/>
);
};
export default CustomMarker;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6715 次 |
| 最近记录: |