Загрузить Google Place API в проекте Gatsbyjs (Reactjs) - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь использовать адресную службу автозаполнения из Google Place API.

Нашел эту библиотеку: https://github.com/kenny-hibino/react-places-autocomplete#load-google-library

Он запрашивает загрузку библиотеки в моем проекте: https://github.com/kenny-hibino/react-places-autocomplete#getting-started

Я бы сделал это в public / index.html, если это чистый проект Reactjs. Однако public / index.html в проекте Gatsbyjs будет удаляться и перегенерироваться каждый раз при запуске:

Gatsby develop

командная строка.

Как я могу использовать API Google Place в моем проекте Gatsbyjs?

Обновление

Я пробовал 2 способа добиться этого.

  1. Используйте React-Helmet в /layouts/index.js, вот как это выглядит:

        <Helmet>
          <script src="https://maps.googleapis.com/maps/api/js?key={API}&libraries=places&callback=initAutocomplete" async defer></script>
        </Helmet>
    

    enter image description here

  2. Поместите ссылку на скрипт в /public/index.html, который выглядит следующим образом:

    <!DOCTYPE html>
    <html>
    
    <head>
        <meta charSet="utf-8" />
        <meta http-equiv="x-ua-compatible" content="ie=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
        <title data-react-helmet="true"></title>
        <script src="/socket.io/socket.io.js"></script>
        <script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?key={API_KEY}&libraries=places" async defer ></script>
    </head>
    
    <body>
        <div id="___gatsby"></div>
        <script src="/commons.js"></script>
    </body>
    
    </html>
    

Для первого решения каждый раз, когда я обновляю свою страницу, проект выдает ошибку, запрашивающую загрузку API Google JavaScript Map.

Для 2-го решения каждый раз после перезапуска Gatsby из командной строки: gatsby develop

он заново генерирует index.html, который стирает мою ссылку JavaScript в нем.

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Использование html.js

Модификация src/html.js примерно так (как предлагает Нену) - один из вариантов.

import React, { Component } from 'react'
import PropTypes from 'prop-types'

export default class HTML extends Component {
  render() {
    return (
      <html {...this.props.htmlAttributes}>
        <head>
          <meta charSet="utf-8" />
          <meta httpEquiv="x-ua-compatible" content="ie=edge" />
          <meta
            name="viewport"
            content="width=device-width, initial-scale=1, shrink-to-fit=no"
          />
          {this.props.headComponents}
        </head>
        <body {...this.props.bodyAttributes}>
          {this.props.preBodyComponents}
          <div
            key={`body`}
            id="___gatsby"
            dangerouslySetInnerHTML={{ __html: this.props.body }}
          />
          {this.props.postBodyComponents}
          // MODIFICATION
          // ===================
          <script
            src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY"
            async
            defer
          />
          // ===================
        </body>
      </html>
    )
  }
}

HTML.propTypes = {
  htmlAttributes: PropTypes.object,
  headComponents: PropTypes.array,
  bodyAttributes: PropTypes.object,
  preBodyComponents: PropTypes.array,
  body: PropTypes.string,
  postBodyComponents: PropTypes.array,
}

Затем вы можете получить доступ к API Карт Google в любом месте вашего проекта с window.google.maps.[Map/Marker/etc.].

Реактивный путь

Для меня это было немного анахронизмом. Если вам нужен повторно используемый компонент React, который вы можете импортировать на любую страницу или шаблон как import Map from './Map', я предлагаю это вместо.

// src/components/Map.js
import React, { Component } from 'react'

export default class Map extends Component {
  onLoad = () => {
    const map = new window.google.maps.Map(
      document.getElementById(this.props.id),
      this.props.options
    )
    this.props.onMount(map)
  }

  componentDidMount() {
    if (!window.google) {
      const script = document.createElement('script')
      script.type = 'text/javascript'
      script.src = `https://maps.google.com/maps/api/js?key=YOUR_API_KEY`
      const headScript = document.getElementsByTagName('script')[0]
      headScript.parentNode.insertBefore(script, headScript)
      script.addEventListener('load', () => {
        this.onLoad()
      })
    } else {
      this.onLoad()
    }
  }

  render() {
    return <div style={{ height: `50vh` }} id={this.props.id} />
  }
}

Используйте это так:

// src/pages/contact.js
import React from 'react'

import Map from '../components/Map'

const center = { lat: 50, lng: 10 }
const mapProps = {
  options: {
    center,
    zoom: 8,
  },
  onMount: map => {
    new window.google.maps.Marker({
      position: center,
      map,
      title: 'Europe',
    })
  },
}

const Contact = () => {
  return (
        <h1>Contact</h1>
        <Map id="contactMap" {...mapProps} />
  )
}

export default Contact
0 голосов
/ 11 мая 2018

Вы не должны изменять файлы в public forlder с GatsbyJS .

Вместо этого я рекомендую вам настроить ваш html.js файл .

Для этого сначала запустите:

cp .cache/default-html.js src/html.js

Вы должны иметь файл html.js в / src / html.js .

Теперь вы можете поместить свой тег <script> в <head>.

...