react-google-maps标记点击事件

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)

Vad*_*hev 5

在这个例子中

<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)


lus*_*chn 5

您可以为标记创建一个自定义组件,并通过其他参数来识别它-例如,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)