react-google-maps
Version:
React.js Google Maps integration component
253 lines (173 loc) • 8.73 kB
Markdown
# react-google-maps
> React.js Google Maps integration component
[![Version][npm-image]][npm-url] [![Travis CI][travis-image]][travis-url] [![Quality][codeclimate-image]][codeclimate-url] [![Coverage][codeclimate-coverage-image]][codeclimate-coverage-url] [![Dependencies][gemnasium-image]][gemnasium-url] [![Gitter][gitter-image]][gitter-url]
## Call for maintainers
As the author ([tomchentw][tomchentw]) currently doesn't actively use this module, he's looking for awesome contributors to help and keep the community healthy. Please don't hensitate to [contact him][tomchentw] directly. See [#266][call-for-maintainers] for more information.
## Quick start: SimpleMap
Declare your Google Maps components using React components.
```js
import {GoogleMapLoader, GoogleMap, Marker} from "react-google-maps";
export default function SimpleMap (props) {
return (
<section style={{height: "100%"}}>
<GoogleMapLoader
containerElement={
<div
{...props.containerElementProps}
style={{
height: "100%",
}}
/>
}
googleMapElement={
<GoogleMap
ref={(map) => console.log(map)}
defaultZoom={3}
defaultCenter={{ lat: -25.363882, lng: 131.044922 }}
onClick={props.onMapClick}
>
{props.markers.map((marker, index) => {
return (
<Marker
{...marker}
onRightclick={() => props.onMarkerRightclick(index)} />
);
})}
</GoogleMap>
}
/>
</section>
);
}
```
## Documentation
### Rule 1
Define `<GoogleMap>` component in the top level. Use `containerProps`, `containerTagName` to customize the wrapper DOM for the component.
Other components like `<Marker>` belong to the children of `<GoogleMap>`. You already know this from the example code above.
### Rule 2
Everything in the `Methods` table in the [official documentation](https://developers.google.com/maps/documentation/javascript/3.exp/reference#Marker) of the component could be set directly via component's *props* . For example, a `<Marker>` component has the following *props*:
```
animation, attribution, clickable, cursor, draggable, icon, label, opacity, options, place, position, shape, title, visible, zIndex
```
### Rule 3
Every props mentioned in __Rule 2__ could be either [controlled](https://facebook.github.io/react/docs/forms.html#controlled-components) or [uncontrolled](https://facebook.github.io/react/docs/forms.html#uncontrolled-components) property. Free to use either one depends on your use case.
### Rule 4
Anything that is inside components' `options` property can __ONLY__ be accessible via `props.options`. It's your responsibility to manage the `props.options` object during the React lifetime of your component. My suggestion is, always use __Rule 3__ if possible. Only use `options` when it's necessary.
### Rule 5
Event handlers on these components can be bound using React component convention. There's a list of event names that exist in the `eventLists` folder. Find the supported event name and use the form of `on${ camelizedEventName }`. For example, If I want to add `center_changed` callback to a map instance, I'll do the following with `react-google-maps`:
```js
<GoogleMap
// onCenterChanged: on + camelizedEventName(center_change)
onCenterChanged={this.handleCenterChanged}
/>
```
The list of event names can be found [here](https://github.com/tomchentw/react-google-maps/blob/master/src/eventLists/GoogleMapEventList.js).
### Check the examples
Static hosted [demo site][demo] on GitHub. The code is located under [examples/gh-pages][examples_gh_pages] folder.
## Usage
`react-google-maps` requires __React >= 0.14__
```sh
npm install --save react-google-maps
```
All components are available on the top-level export.
```js
import { GoogleMap, Marker, SearchBox } from "react-google-maps";
```
### Loading Libraries
To use this component, you are going to need to load the [Google Maps Javascript API].
It is optional, but recommended, to specify the libraries you will be using as well as your API key.
You could do it synchronously like so:
```html
<script type="text/javascript"
src="https://maps.googleapis.com/maps/api/js?key=[YOUR_API_KEY]&libraries=geometry,places,visualization">
</script>
```
```js
<GoogleMapLoader
query={{ libraries: "geometry,drawing,places,visualization" }}
...
```
Or asynchronously using the ScriptjsLoader:
```js
<ScriptjsLoader
hostname={"maps.googleapis.com"}
pathname={"/maps/api/js"}
query={{ key: "[YOUR_API_KEY]", libraries: "geometry,drawing,places" }}
...
```
### Trigger events
`triggerEvent(component, ...args)`: One common event trigger is to resize map after the size of the container div change.
```js
import {triggerEvent} from "react-google-maps/lib/utils";
function handleWindowResize () {
triggerEvent(this._googleMapComponent, "resize");
}
// and you'll get `this._googleMapComponent` like this:
<GoogleMap ref={it => this._googleMapComponent = it} />
```
### Optimize bundle size
You could of course import from individual modules to save your [webpack][webpack]'s bundle size.
```js
import GoogleMap from "react-google-maps/lib/GoogleMap"; // Or import {default as GoogleMap} ...
```
### Additional Addons
Some addons component could __ONLY__ be accessible via direct import:
```js
import InfoBox from "react-google-maps/lib/addons/InfoBox";
```
## Changelog
The changelog is automatically generated via [conventional-changelog][conventional-changelog] and [can be found in project root](https://github.com/tomchentw/react-google-maps/blob/master/CHANGELOG.md) as well as npm tarball.
## Development
First, clone the project.
```shell
git clone ...
```
### With Docker
Install `docker@^1.8.2`, `docker-compose@^1.4.0` and optionally `docker-machine@^0.4.1`. Then,
```shell
docker-compose run --service-ports web
```
Then open [http://192.168.59.103:8080](http://192.168.59.103:8080).
**192.168.59.103** is actually your ip from `docker-machine ip`.
If you change code in your local, you'll need to rebuild the image to make changes happen.
If you're previously using `boot2docker`, you may want to migrate to [docker-machine](https://docs.docker.com/machine/migrate-to-machine/) instead.
```shell
docker-compose build
```
### Without Docker
Install `node`. Then,
```shell
npm install
cd examples/gh-pages
npm install
npm start
```
Then open [http://localhost:8080/webpack-dev-server/](http://localhost:8080/webpack-dev-server/).
## Contributing
[![devDependency Status][david-dm-image]][david-dm-url]
1. Fork it
2. Create your feature branch (`git checkout -b my-new-feature`)
3. Commit your changes (`git commit -am 'Add some feature'`)
4. Push to the branch (`git push origin my-new-feature`)
5. Create new Pull Request
[npm-image]: https://img.shields.io/npm/v/react-google-maps.svg?style=flat-square
[npm-url]: https://www.npmjs.org/package/react-google-maps
[travis-image]: https://img.shields.io/travis/tomchentw/react-google-maps.svg?style=flat-square
[travis-url]: https://travis-ci.org/tomchentw/react-google-maps
[codeclimate-image]: https://img.shields.io/codeclimate/github/tomchentw/react-google-maps.svg?style=flat-square
[codeclimate-url]: https://codeclimate.com/github/tomchentw/react-google-maps
[codeclimate-coverage-image]: https://img.shields.io/codeclimate/coverage/github/tomchentw/react-google-maps.svg?style=flat-square
[codeclimate-coverage-url]: https://codeclimate.com/github/tomchentw/react-google-maps
[gemnasium-image]: https://img.shields.io/gemnasium/tomchentw/react-google-maps.svg?style=flat-square
[gemnasium-url]: https://gemnasium.com/tomchentw/react-google-maps
[gitter-image]: https://badges.gitter.im/Join%20Chat.svg
[gitter-url]: https://gitter.im/tomchentw/react-google-maps?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge
[david-dm-image]: https://img.shields.io/david/dev/tomchentw/react-google-maps.svg?style=flat-square
[david-dm-url]: https://david-dm.org/tomchentw/react-google-maps#info=devDependencies
[tomchentw]: https://github.com/tomchentw
[call-for-maintainers]: https://github.com/tomchentw/react-google-maps/issues/266
[demo]: http://tomchentw.github.io/react-google-maps/
[examples_gh_pages]: https://github.com/tomchentw/react-google-maps/tree/master/examples/gh-pages
[webpack]: http://webpack.github.io/docs/tutorials/getting-started/
[conventional-changelog]: https://github.com/ajoslin/conventional-changelog
[Google Maps Javascript API]: https://developers.google.com/maps/documentation/javascript/