(React)打开一个模式上的谷歌地图标记点击
(React) Opening a Modal on Google Maps Marker Click
更新:添加了Dandy's我现在可以访问这个。setState函数如果我把这个绑定到componentDidMount,但是因为这个。setState在componentDidMount中。setState不是函数
我想我必须在componentDidMount之外建立地图,但我不确定从哪里开始
原始:所以我在React中建立一个谷歌地图,我想在标记点击上打开一个模态。
我在渲染中有模态和
marker.addListener('click', function() {
infowindow.open(map, marker);
this.setState({ showModal: true });
});
在componentDidMount,但我看到我不能改变componentDidMount的状态…任何建议,我如何能得到我的模态显示在标记点击?
import React from 'react';
import {Link} from 'react-router';
import {
Row,
Col,
FormGroup,
ControlLabel,
FormControl,
Button,
Grid,
Modal,
Popover,
Tooltip,
OverlayTrigger
} from 'react-bootstrap';
export class Maps extends React.Component {
constructor(props) {
super(props);
userPosition: {lat: 40.7128, lng: -74.0059},
defaultCenter: {
lat: 40.7128,
lng: -74.0059
},
showModal: false,
};
this.close = this.close.bind(this);
this.open = this.open.bind(this);
this.componentDidMount = this.componentDidMount.bind(this);
}
close() {
this.setState({ showModal: false });
}
open() {
this.setState({ showModal: true });
}
componentDidMount() {
// this.getCurrentPosition();
var contentString = '<div id="content">'+
'<div id="siteNotice">'+
'</div>'+
'<h1 id="firstHeading" class="firstHeading">New York</h1>'+
'<div id="bodyContent">'+
'<p>content string</p>'+
'</div>'+
'</div>';
let sourland = {lat: 40.473927, lng: -74.694482};
var map = new google.maps.Map(document.getElementById('map'), {
zoom: 12,
center: {
lat: 40.7128,
lng: -74.0059
}
});
var infowindow = new google.maps.InfoWindow({
content: contentString,
maxWidth: 200
});
var marker = new google.maps.Marker({
position: sourland,
map: map,
title: 'Uluru (Ayers Rock)'
});
// modal code
marker.addListener('click', function() {
infowindow.open(map, marker);
this.setState({ showModal: true });
});
}
render(){
console.log(this.state);
const popover = (
<Popover id="modal-popover" title="popover">
very popover. such engagement
</Popover>
);
const tooltip = (
<Tooltip id="modal-tooltip">
wow.
</Tooltip>
);
return (
<div>
<div id="map" className="map-container"></div>
<Button
bsStyle="primary"
bsSize="large"
onClick={this.open}
>
Launch demo modal
</Button>
<Modal show={this.state.showModal} onHide={this.close}>
<Modal.Header closeButton>
<Modal.Title>Sourland Mountain Preserve Climbs</Modal.Title>
</Modal.Header>
<Modal.Body>
<h4>Sourland Mountain Preserve</h4>
<p>Climbing is allowed in blank, but watch out for blank.</p>
<h4>This is a Popover</h4>
<p>there is a <OverlayTrigger overlay={popover}><a href="#">popover</a></OverlayTrigger> here</p>
<h4>Tooltips in a modal</h4>
<p>there is a <OverlayTrigger overlay={tooltip}><a href="#">tooltip</a></OverlayTrigger> here</p>
</Modal.Body>
<Modal.Footer>
<Button onClick={this.close}>Close</Button>
</Modal.Footer>
</Modal>
</div>
);
}
}
在实现Dandy的构造函数修复后,我使用Daniel Andrews的ES6 React GMap component帖子作为参考,在ES6中重写了地图组件。
因为这个组件是在Meteor 1.4应用程序中使用的,所以我必须严格使用ES6(没有ES5或ES7+,就像Andrews的例子一样)
export class Maps extends React.Component {
constructor(props) {
super(props);
this.state = {
userPosition: {lat: 40.7128, lng: -74.0059},
defaultCenter: {
lat: 40.7128,
lng: -74.0059
},
zoom: 10,
showModal: false,
};
this.close = this.close.bind(this);
this.open = this.open.bind(this);
}
componentDidMount() {
this.map = this.createMap()
this.marker = this.createMarker()
this.infoWindow = this.createInfoWindow()
google.maps.event.addListener(this.map, 'zoom_changed', ()=> this.handleZoomChange())
google.maps.event.addListener(this.marker, 'click', ()=> this.handleMarkerClick())
}
componentDidUnMount() {
google.maps.event.clearListeners(map, 'zoom_changed')
}
createMap() {
let mapOptions = {
zoom: this.state.zoom,
center: this.mapCenter()
}
return new google.maps.Map(this.refs.mapCanvas, mapOptions)
}
mapCenter() {
return new google.maps.LatLng(
this.state.defaultCenter.lat,
this.state.defaultCenter.lng
)
}
createMarker() {
return new google.maps.Marker({
position: this.mapCenter(),
map: this.map
})
}
createInfoWindow() {
let contentString = "<div class='InfoWindow'>I'm a Window that contains Info Yay</div>"
return new google.maps.InfoWindow({
map: this.map,
anchor: this.marker,
content: contentString
})
}
handleMarkerClick(){
console.log("ow");
this.setState({
showModal: true
});
this.infowindow.open(map, marker);
}
handleZoomChange() {
this.setState({
zoom: this.map.getZoom()
})
}
close() {
this.setState({ showModal: false });
}
open() {
this.setState({ showModal: true });
}
render() {
const popover = (
<Popover id="modal-popover" title="popover">
very popover. such engagement
</Popover>
);
const tooltip = (
<Tooltip id="modal-tooltip">
wow.
</Tooltip>
);
return <div>
<div className="GMap">
<div className='UpdatedText'>
<p>Current Zoom: { this.state.zoom }</p>
</div>
<div className='GMap-canvas' ref="mapCanvas">
</div>
</div>
<Modal show={this.state.showModal} onHide={this.close}>
<Modal.Header closeButton>
<Modal.Title>Sourland Mountain Preserve Climbs</Modal.Title>
</Modal.Header>
<Modal.Body>
<h4>Sourland Mountain Preserve</h4>
<p>Climbing is allowed in blank, but watch out for blank.</p>
<h4>This is a Popover</h4>
<p>there is a <OverlayTrigger overlay={popover}><a href="#">popover</a></OverlayTrigger> here</p>
<h4>Tooltips in a modal</h4>
<p>there is a <OverlayTrigger overlay={tooltip}><a href="#">tooltip</a></OverlayTrigger> here</p>
<hr />
</Modal.Body>
<Modal.Footer>
<Button onClick={this.close}>Close</Button>
</Modal.Footer>
</Modal>
</div>
}
}
从您的代码来看,您似乎没有在构造函数中设置正确的状态。因此,'showModal'的状态是不可访问的/不存在。
确保你的构造函数被配置为设置组件的状态:
改变:
constructor(props) {
super(props);
userPosition: {lat: 40.7128, lng: -74.0059},
defaultCenter: {
lat: 40.7128,
lng: -74.0059
},
showModal: false,
};
Into this:
constructor(props) {
super(props);
this.state = {
userPosition: {lat: 40.7128, lng: -74.0059},
defaultCenter: {
lat: 40.7128,
lng: -74.0059
},
showModal: false
}
};
这应该确保正确使用this.setState()
将组件的状态从true更新为false。
相关文章:
- 谷歌地图固定位置覆盖
- 不显示带有本地json文件数据的谷歌地图脚本
- 谷歌地图不是以HTML显示,而是在JS Fiddle上工作
- 谷歌地图标记不会显示
- 无法在JS中显示谷歌地图
- 科尔多瓦页面类应用程序中的多个谷歌地图
- 需要帮助谷歌地图方向面板在FancyBox中显示
- 在谷歌地图上获取事件的x,y坐标
- 谷歌地图API v3不适用于移动浏览器或PhoneGap
- 模拟谷歌地图中的点击
- 如何知道哪个标记被谷歌地图点击了
- 谷歌地图JS API+JSON-多个标记没有显示
- 缓存谷歌地图数据
- 谷歌地图劫持了iphone's滚动(触摸事件)-如何恢复
- 方向问题地图谷歌地图 API
- 函数更新地图谷歌地图 API
- 动态添加标记更改地图-谷歌地图API
- 两个页面上的三个谷歌地图(谷歌地图V3)
- 刷新/重新加载地图:谷歌地图API V2
- 用新地图(和新选项)替换地图-谷歌地图API