This is mainly a question about 'translating' JS to JSX.
I have a react-google-maps map which contains a marker, and a circle around that marker:
The Map component:
export class Map extends Component {
render() {
const GoogleMapInstance = withGoogleMap(props => (
<GoogleMap
defaultCenter = { { lat: parseFloat(this.props.lat), lng: parseFloat(this.props.lng) } }
defaultZoom = { 16 }
defaultOptions={{ styles: mapStyles }}
>
<Marker position={{ lat: parseFloat(this.props.lat), lng: parseFloat(this.props.lng) }}/>
<Circle center={{ lat: parseFloat(this.props.lat), lng: parseFloat(this.props.lng) }} radius={parseFloat(this.props.accuracy)} options={{ fillColor: 'red', strokeColor: 'red' }}/>
</GoogleMap>
))
return (
<div>
<GoogleMapInstance
containerElement={ <div style={{ height: '600px', width: '100%' }}/> }
mapElement={ <div style={{ height: '100%' }}/> }
/>
</div>
)
}
}
I would like the map to be zoomed such that the circle takes up about 50% of the map. I understand using the Javascript API, I can just do:
map.fitBounds(circle.getBounds())
But I'm not sure how to integrate that with the JSX that I have...
You probably want to do something like this:
export class Map extends Component {
constructor(props) {
super(props)
this.map = React.createRef()
this.circle = React.createRef()
}
componentDidMount() {
if (this.map && this.circle) {
const bounds = this.circle.current.getBounds()
this.map.current.fitBounds(bounds)
}
}
render() {
const GoogleMapInstance = withGoogleMap(props => (
<GoogleMap
defaultCenter = { { lat: parseFloat(this.props.lat), lng: parseFloat(this.props.lng) } }
defaultZoom = { 16 }
defaultOptions={{ styles: mapStyles }}
ref={this.map}
>
<Marker position={{ lat: parseFloat(this.props.lat), lng: parseFloat(this.props.lng) }}/>
<Circle ref={this.circle} center={{ lat: parseFloat(this.props.lat), lng: parseFloat(this.props.lng) }} radius={parseFloat(this.props.accuracy)} options={{ fillColor: 'red', strokeColor: 'red' }}/>
</GoogleMap>
))
return (
<div>
<GoogleMapInstance
containerElement={ <div style={{ height: '600px', width: '100%' }}/> }
mapElement={ <div style={{ height: '100%' }}/> }
/>
</div>
)
}
}
The refs
create a way to access the GoogleMap
and Circle
nodes, and the componentDidMount
is a lifecycle hook that lets you run the fitBounds
call when the Map
component is first rendered to the DOM.
Indeed, you could access native Google Map and Circle objects via Ref
and manipulate it. But when it comes to getting map instance, prefer Map idle
event over componentDidMount()
lifecycle method to guarantee the map is ready, for example:
handleMapIdle() {
const map = this.map.current; //get Google Map instance
//...
}
where
<GoogleMap
ref={this.map}
onIdle={this.handleMapIdle}
...
>
...
</GoogleMap>
Here is a modified Map component:
class Map extends Component {
constructor(props) {
super(props);
this.map = React.createRef();
this.circle = React.createRef();
this.handleMapIdle = this.handleMapIdle.bind(this);
this.idleCalled = false;
}
handleMapIdle() {
if (!this.idleCalled) {
const bounds = this.circle.current.getBounds();
this.map.current.fitBounds(bounds);
this.idleCalled = true;
}
}
render() {
const GoogleMapInstance = withGoogleMap(props => (
<GoogleMap
ref={this.map}
defaultCenter={{
lat: parseFloat(this.props.lat),
lng: parseFloat(this.props.lng)
}}
defaultZoom={this.props.zoom}
onIdle={this.handleMapIdle}
>
<Marker
position={{
lat: parseFloat(this.props.lat),
lng: parseFloat(this.props.lng)
}}
/>
<Circle
ref={this.circle}
center={{
lat: parseFloat(this.props.lat),
lng: parseFloat(this.props.lng)
}}
radius={parseFloat(this.props.accuracy)}
options={{ fillColor: "red", strokeColor: "red" }}
/>
</GoogleMap>
));
return (
<div>
<GoogleMapInstance
containerElement={<div style={{ height: "600px", width: "100%" }} />}
mapElement={<div style={{ height: "100%" }} />}
/>
</div>
);
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.