React Google Map InfoWindow 在我点击单个标记时显示所有信息
React Google Map InfoWindow showing all the info when I click on a single Mark
出于某种原因,当我单击单个标记时,会显示所有信息窗口。我希望当我单击一个标记时会出现一个 InfoWindow。
有人可以解释为什么所有标记中的所有 InfoWindow 都会出现吗?所以当我关闭它时,InfoWindow 也会关闭。
预期的行为是当我单击目标标记时信息窗口打开。
class VenuesMap extends Component {
constructor(props) {
super(props);
this.state = {
isOpen: false,
};
}
handleToggleOpen = () => {
this.setState({
isOpen: true,
});
};
handleToggleClose = () => {
this.setState({
isOpen: false,
});
};
render() {
const venues = this.props.venues;
let markers;
let userMarkers = (
<Marker
position={{
lat: Number(latCurrentLocation),
lng: Number(lngCurrentLocation),
}}
/>
);
if (venues !== null) {
markers = venues.map((location, i) => {
const lat = location.venue.location.lat;
const lng = location.venue.location.lng;
const index = i + 1;
return (
<Marker
key={i}
position={{ lat: lat, lng: lng }}
label={index.toString()}
onClick={() => this.handleToggleOpen()}
>
{this.state.isOpen && (
<InfoWindow onCloseClick={() => this.handleToggleClose()}>
<span>Something</span>
</InfoWindow>
)}
</Marker>
);
});
}
const MapWithAMarker = withGoogleMap(props => (
<GoogleMap
defaultZoom={this.state.zoom}
defaultCenter={{
lat: Number(latCurrentLocation) || 40.7128,
lng: Number(lngCurrentLocation) || -74.006,
}}
>
{markers}
{userMarkers}
</GoogleMap>
));
const googleMap = (
<MapWithAMarker
containerElement={
<div style={{ height: this.props.containerElement }} />
}
mapElement={<div style={{ height: this.props.mapElement }} />}
/>
);
return <div>{googleMap}</div>;
}
}
您需要的是每个信息 window 的单独 isOpen 状态,否则如果 isOpen
为真,所有信息都会打开。
选项 1:您可以创建一个组件 <MarkerWithInfoWindow>
,您可以在其中维护它自己的 isOpen
状态。这仍然允许通过一个一个地单击同时打开多个。
选项 2:
如果你想保持结构相同(这样你可以在另一个打开时关闭一个),你可以在状态中存储一个 openInfoWindowMarkerId
,像这样
this.state = {
openInfoWindowMarkerId: ''
}
然后你可以做类似的事情
handleToggleOpen = (markerId) => {
this.setState({
openInfoWindowMarkerId: markerId
});
}
你可以这样称呼它
<Marker
key={i}
position={{ lat: lat, lng: lng}}
label={index.toString()}
onClick={() => this.handleToggleOpen(i)} // marker ID is the key here.
>
我按照上面的解释解决了这个问题。
我将每个标记提取到一个组件本身中。
我将 Mark 和 InfoWindow 合并为一个组件。
import React, {Component} from 'react';
import { Marker, InfoWindow } from "react-google-maps";
class InfoWindowMap extends Component {
constructor(props){
super(props);
this.state = {
isOpen: false
}
}
handleToggleOpen = () => {
this.setState({
isOpen: true
});
}
handleToggleClose = () => {
this.setState({
isOpen: false
});
}
render() {
return (
<Marker
key={this.props.index}
position={{ lat: this.props.lat, lng: this.props.lng}}
label={this.props.index.toString()}
onClick={() => this.handleToggleOpen()}
>
{
this.state.isOpen &&
<InfoWindow onCloseClick={this.props.handleCloseCall}>
<span>Something</span>
</InfoWindow>
}
</Marker>
)
}
}
export default InfoWindowMap;
try this:
{props.nhatro.map((nhatro, index) =>
<Marker
key={index}
options={{icon: 'https://i.imgur.com/9G5JOp8.png'}}
position={nhatro}
onClick={()=>{ props.showInfo(index)} }
>
{ (props.showInfoIndex == index ) &&
<InfoWindow onCloseClick={props.onToggleOpen}>
<div>
<div>nhà trọ cho thuê</div>
<div >1.500.000đ</div>
</div>
</InfoWindow>}
</Marker>
)}
and then :
showInfo(a){
setState({showInfoIndex: a })
}
出于某种原因,当我单击单个标记时,会显示所有信息窗口。我希望当我单击一个标记时会出现一个 InfoWindow。 有人可以解释为什么所有标记中的所有 InfoWindow 都会出现吗?所以当我关闭它时,InfoWindow 也会关闭。
预期的行为是当我单击目标标记时信息窗口打开。
class VenuesMap extends Component {
constructor(props) {
super(props);
this.state = {
isOpen: false,
};
}
handleToggleOpen = () => {
this.setState({
isOpen: true,
});
};
handleToggleClose = () => {
this.setState({
isOpen: false,
});
};
render() {
const venues = this.props.venues;
let markers;
let userMarkers = (
<Marker
position={{
lat: Number(latCurrentLocation),
lng: Number(lngCurrentLocation),
}}
/>
);
if (venues !== null) {
markers = venues.map((location, i) => {
const lat = location.venue.location.lat;
const lng = location.venue.location.lng;
const index = i + 1;
return (
<Marker
key={i}
position={{ lat: lat, lng: lng }}
label={index.toString()}
onClick={() => this.handleToggleOpen()}
>
{this.state.isOpen && (
<InfoWindow onCloseClick={() => this.handleToggleClose()}>
<span>Something</span>
</InfoWindow>
)}
</Marker>
);
});
}
const MapWithAMarker = withGoogleMap(props => (
<GoogleMap
defaultZoom={this.state.zoom}
defaultCenter={{
lat: Number(latCurrentLocation) || 40.7128,
lng: Number(lngCurrentLocation) || -74.006,
}}
>
{markers}
{userMarkers}
</GoogleMap>
));
const googleMap = (
<MapWithAMarker
containerElement={
<div style={{ height: this.props.containerElement }} />
}
mapElement={<div style={{ height: this.props.mapElement }} />}
/>
);
return <div>{googleMap}</div>;
}
}
您需要的是每个信息 window 的单独 isOpen 状态,否则如果 isOpen
为真,所有信息都会打开。
选项 1:您可以创建一个组件 <MarkerWithInfoWindow>
,您可以在其中维护它自己的 isOpen
状态。这仍然允许通过一个一个地单击同时打开多个。
选项 2:
如果你想保持结构相同(这样你可以在另一个打开时关闭一个),你可以在状态中存储一个 openInfoWindowMarkerId
,像这样
this.state = {
openInfoWindowMarkerId: ''
}
然后你可以做类似的事情
handleToggleOpen = (markerId) => {
this.setState({
openInfoWindowMarkerId: markerId
});
}
你可以这样称呼它
<Marker
key={i}
position={{ lat: lat, lng: lng}}
label={index.toString()}
onClick={() => this.handleToggleOpen(i)} // marker ID is the key here.
>
我按照上面的解释解决了这个问题。
我将每个标记提取到一个组件本身中。
我将 Mark 和 InfoWindow 合并为一个组件。
import React, {Component} from 'react';
import { Marker, InfoWindow } from "react-google-maps";
class InfoWindowMap extends Component {
constructor(props){
super(props);
this.state = {
isOpen: false
}
}
handleToggleOpen = () => {
this.setState({
isOpen: true
});
}
handleToggleClose = () => {
this.setState({
isOpen: false
});
}
render() {
return (
<Marker
key={this.props.index}
position={{ lat: this.props.lat, lng: this.props.lng}}
label={this.props.index.toString()}
onClick={() => this.handleToggleOpen()}
>
{
this.state.isOpen &&
<InfoWindow onCloseClick={this.props.handleCloseCall}>
<span>Something</span>
</InfoWindow>
}
</Marker>
)
}
}
export default InfoWindowMap;
try this:
{props.nhatro.map((nhatro, index) =>
<Marker
key={index}
options={{icon: 'https://i.imgur.com/9G5JOp8.png'}}
position={nhatro}
onClick={()=>{ props.showInfo(index)} }
>
{ (props.showInfoIndex == index ) &&
<InfoWindow onCloseClick={props.onToggleOpen}>
<div>
<div>nhà trọ cho thuê</div>
<div >1.500.000đ</div>
</div>
</InfoWindow>}
</Marker>
)}
and then :
showInfo(a){
setState({showInfoIndex: a })
}