这主要是关于将JS“转换”为JSX的问题。
我有一个react-google-maps地图,其中包含一个标记,以及围绕该标记的圆圈:
地图组件:
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>
)
}
}
我希望缩放地图,使圆圈占据地图的大约50%。我了解使用Javascript API可以做到:
map.fitBounds(circle.getBounds())
但是我不确定如何将其与我拥有的JSX集成...
答案 0 :(得分:0)
您可能想要执行以下操作:
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>
)
}
}
refs
创建了一种访问GoogleMap
和Circle
节点的方法,而componentDidMount
是生命周期挂钩,可让您运行fitBounds
调用当Map
组件首次呈现到DOM时。
答案 1 :(得分:0)
实际上,您可以通过Ref
访问本机Google Map和Circle对象并对其进行操作。但是,在获取地图实例时,请使用Map idle
event而非componentDidMount()
生命周期方法来确保地图已准备就绪,例如:
handleMapIdle() {
const map = this.map.current; //get Google Map instance
//...
}
其中
<GoogleMap
ref={this.map}
onIdle={this.handleMapIdle}
...
>
...
</GoogleMap>
这是经过修改的Map组件:
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>
);
}
}