最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Google Maps ReactRedux component - Stack Overflow

programmeradmin1浏览0评论

My React/Redux ponent for working with Google Maps:

import React, { Component, PropTypes } from 'react'
import { connect } from 'react-redux'

import { changeMapCenter } from '../actions'

class Map extends Component {

  ponentDidMount() {
    let script = document.createElement('script')

    script.setAttribute('type', 'text/javascript')
    script.setAttribute('src', ';callback=initMap')
    document.getElementsByTagName('head')[0].appendChild(script)

    window.initMap = () => {
      this.map = new google.maps.Map(document.getElementById('map'), {
        center: this.props.defaultCenter,
        zoom: this.props.defaultZoom
      });

      this.map.addListener('center_changed', (event) => {
        let center = {
          lat: this.map.getCenter().lat(),
          lng: this.map.getCenter().lng()
        }
        this.props.onMapCenterChanging(center)
      });
    }
  }

  render() {
    return (
      <div id='map'></div>
    );  
  }
}

const mapStateToProps = (state) => {
  return {
    mapPoints: state.mapPoints
  }
}

const mapDispatchToProps = (dispatch) => {
  return {
    onMapCenterChanging: (center) => {
      dispatch(changeMapCenter(center))
    }    
  }
}

export default connect(mapStateToProps, mapDispatchToProps)(Map)

As you can see now this ponent just initializes map and listens map center changing. Now I need render some markers (mapPoints). From Google API Documentation I can do it (for example):

  var marker = new google.maps.Marker({
    position: myLatlng,
    map: map,
    title: 'Click to zoom'
  });

But how can I do in 'React-style'? Because drawing marker is not 'render' HTML, it's just calling JS Google Maps API function. I can put this logic in 'initMap' function, but my 'mapPoints' can change. Should I put JS logic (removing deleted points / draw new points) in 'render' function? Thanks!

My React/Redux ponent for working with Google Maps:

import React, { Component, PropTypes } from 'react'
import { connect } from 'react-redux'

import { changeMapCenter } from '../actions'

class Map extends Component {

  ponentDidMount() {
    let script = document.createElement('script')

    script.setAttribute('type', 'text/javascript')
    script.setAttribute('src', 'https://maps.googleapis./maps/api/js?key=AIzaSyCXg-YGJF&callback=initMap')
    document.getElementsByTagName('head')[0].appendChild(script)

    window.initMap = () => {
      this.map = new google.maps.Map(document.getElementById('map'), {
        center: this.props.defaultCenter,
        zoom: this.props.defaultZoom
      });

      this.map.addListener('center_changed', (event) => {
        let center = {
          lat: this.map.getCenter().lat(),
          lng: this.map.getCenter().lng()
        }
        this.props.onMapCenterChanging(center)
      });
    }
  }

  render() {
    return (
      <div id='map'></div>
    );  
  }
}

const mapStateToProps = (state) => {
  return {
    mapPoints: state.mapPoints
  }
}

const mapDispatchToProps = (dispatch) => {
  return {
    onMapCenterChanging: (center) => {
      dispatch(changeMapCenter(center))
    }    
  }
}

export default connect(mapStateToProps, mapDispatchToProps)(Map)

As you can see now this ponent just initializes map and listens map center changing. Now I need render some markers (mapPoints). From Google API Documentation I can do it (for example):

  var marker = new google.maps.Marker({
    position: myLatlng,
    map: map,
    title: 'Click to zoom'
  });

But how can I do in 'React-style'? Because drawing marker is not 'render' HTML, it's just calling JS Google Maps API function. I can put this logic in 'initMap' function, but my 'mapPoints' can change. Should I put JS logic (removing deleted points / draw new points) in 'render' function? Thanks!

Share Improve this question asked Jun 11, 2016 at 20:53 malcoaurimalcoauri 12.2k28 gold badges88 silver badges141 bronze badges 1
  • 4 I get a google is undefined error using your code. – Tyler Zika Commented Mar 19, 2017 at 18:07
Add a ment  | 

1 Answer 1

Reset to default 6

Typically, a React ponent that wraps up some imperative API (like a jQuery widget or similar) does so by not rendering anything (or just rendering a minimal bit of content, like a container div), and then updates the wrapped widget during the React lifecycle methods. There's actually some ponents out there that wrap up the Google Maps API already, and in particular, https://www.fullstackreact./articles/how-to-write-a-google-maps-react-ponent/ walks you through how to do so.

发布评论

评论列表(0)

  1. 暂无评论