如何在 React Google Map 中使用 getDetails()
How to use getDetails() in react Google Map
我现在在 React 中使用 Google Map,现在我在使用 Google PlacesService 的函数 getDetails()
时遇到问题。这是我的代码的一部分,我想在其中使用此功能显示有关 InfoWindow
中所选地点的信息:
<Marker
{...marker}
key={i}
position={marker.location}
title={marker.title}
place_id={marker.place_id}
id={i}
icon={'http://www.serwisstron.pl/icons/' + marker.type + '.png'}
onClick={() => {
props.toggleLocationsActive(i);
}}
animation={google.maps.Animation.DROP}
>
{i === props.activeKey && (
service.getDetails({placeId: marker.place_id}, (marker, status) => {
if(status === google.maps.places.PlacesServiceStatus.OK) {
// here will be code will which put the data on InfoWindow
}
})
)}
<InfoWindow onCloseClick={props.onToggleOpen}>
<div id="details"><strong>{ marker.title } </strong><span><br/>Address:</span><span id="name"></span></div>
</InfoWindow>)}
</Marker>
现在这段代码得到这个错误:
Uncaught TypeError: Cannot read property 'innerHTML' of undefined
at Object._.Tv (util.js:20)
at P4.attributionText_changed (places_impl.js:32)
at Lc (js?libraries=geometry,drawing,places&key=AIzaSyBqtLvddq3jzZ_Lnu9M8266EMVBfXtlUT4:51)
at P4._.M.bindTo (js?libraries=geometry,drawing,places&key=AIzaSyBqtLvddq3jzZ_Lnu9M8266EMVBfXtlUT4:126)
at Object.Q4.f (places_impl.js:32)
at Hr. (js?libraries=geometry,drawing,places&key=AIzaSyBqtLvddq3jzZ_Lnu9M8266EMVBfXtlUT4:179)
at js?libraries=geometry,drawing,places&key=AIzaSyBqtLvddq3jzZ_Lnu9M8266EMVBfXtlUT4:136
at Object. (js?libraries=geometry,drawing,places&key=AIzaSyBqtLvddq3jzZ_Lnu9M8266EMVBfXtlUT4:60)
at js?libraries=geometry,drawing,places&key=AIzaSyBqtLvddq3jzZ_Lnu9M8266EMVBfXtlUT4:136
at Object. (js?libraries=geometry,drawing,places&key=AIzaSyBqtLvddq3jzZ_Lnu9M8266EMVBfXtlUT4:60)
at js?libraries=geometry,drawing,places&key=AIzaSyBqtLvddq3jzZ_Lnu9M8266EMVBfXtlUT4:136
at js?libraries=geometry,drawing,places&key=AIzaSyBqtLvddq3jzZ_Lnu9M8266EMVBfXtlUT4:60
at js?libraries=geometry,drawing,places&key=AIzaSyBqtLvddq3jzZ_Lnu9M8266EMVBfXtlUT4:136
at Sd (js?libraries=geometry,drawing,places&key=AIzaSyBqtLvddq3jzZ_Lnu9M8266EMVBfXtlUT4:63)
at Rd.wa (js?libraries=geometry,drawing,places&key=AIzaSyBqtLvddq3jzZ_Lnu9M8266EMVBfXtlUT4:136)
at util.js:1
也许你们中的一些人知道,如何在 React 中正确使用此功能...
我在 Google 上找了很久,但一无所获...
Github 上的这个项目 link:
https://github.com/hajczek/Neighborhood---Warsaw-Cultural-Map
感谢任何提示:)
所有 DOM 修改都应该通过 React 完成,因为您正在使用它。因此,您应该设置组件的状态,然后根据状态渲染标记,而不是设置 innerHTML(这可能会导致漏洞)。
您可以提取一个呈现 InfoWindow 的组件:
class Popup extends Component {
state = {};
componentDidMount() {
const marker = this.props.marker;
getInfo(marker.title).then(data => {
console.log('---',data);
const link = data[3][0];
const art = data[2][0];
if (link) {
this.setState({
art,
link,
text: "See article in Wikipedia »"
});
} else {
this.setState({
info: "Unfortunately, no info was returned for this data."
});
}
});
geocodeByPlaceId(marker.place_id)
.then(results => {
const address = results[0].formatted_address;
this.setState({ address });
})
.catch(error => console.error(error));
}
render() {
const props = this.props;
return (
<InfoWindow onCloseClick={props.onToggleOpen}>
<div>
<span id="title">{props.marker.title}</span>
<br />
<br />
<span id="address-title">Address:</span>
<br />
<span>{this.state.address}</span>
<br />
<br />
<span>
<em>{this.state.art}</em>
</span>
<br />
<br />
<a target="blank" href={this.state.link}>
{this.state.text}
</a>
<span>{this.state.info}</span>
</div>
</InfoWindow>
);
}
}
并在标记内渲染它:
{i === props.activeKey && (
<Popup marker={marker} onCloseClick={props.onToggleOpen} />
)}
请注意 getInfo
应使用数据解决承诺:
export const getInfo = search => {
return fetch(
"https://pl.wikipedia.org/w/api.php?&origin=*&action=opensearch&search=" +
search +
"&limit=1",
{
headers: { Accept: "application/json" }
}
)
.then(response => response.json())
.catch(e => requestError(e));
上面的示例可能无法正常工作,它只是为了演示该方法。
我现在在 React 中使用 Google Map,现在我在使用 Google PlacesService 的函数 getDetails()
时遇到问题。这是我的代码的一部分,我想在其中使用此功能显示有关 InfoWindow
中所选地点的信息:
<Marker
{...marker}
key={i}
position={marker.location}
title={marker.title}
place_id={marker.place_id}
id={i}
icon={'http://www.serwisstron.pl/icons/' + marker.type + '.png'}
onClick={() => {
props.toggleLocationsActive(i);
}}
animation={google.maps.Animation.DROP}
>
{i === props.activeKey && (
service.getDetails({placeId: marker.place_id}, (marker, status) => {
if(status === google.maps.places.PlacesServiceStatus.OK) {
// here will be code will which put the data on InfoWindow
}
})
)}
<InfoWindow onCloseClick={props.onToggleOpen}>
<div id="details"><strong>{ marker.title } </strong><span><br/>Address:</span><span id="name"></span></div>
</InfoWindow>)}
</Marker>
现在这段代码得到这个错误:
Uncaught TypeError: Cannot read property 'innerHTML' of undefined at Object._.Tv (util.js:20) at P4.attributionText_changed (places_impl.js:32) at Lc (js?libraries=geometry,drawing,places&key=AIzaSyBqtLvddq3jzZ_Lnu9M8266EMVBfXtlUT4:51) at P4._.M.bindTo (js?libraries=geometry,drawing,places&key=AIzaSyBqtLvddq3jzZ_Lnu9M8266EMVBfXtlUT4:126) at Object.Q4.f (places_impl.js:32) at Hr. (js?libraries=geometry,drawing,places&key=AIzaSyBqtLvddq3jzZ_Lnu9M8266EMVBfXtlUT4:179) at js?libraries=geometry,drawing,places&key=AIzaSyBqtLvddq3jzZ_Lnu9M8266EMVBfXtlUT4:136 at Object. (js?libraries=geometry,drawing,places&key=AIzaSyBqtLvddq3jzZ_Lnu9M8266EMVBfXtlUT4:60) at js?libraries=geometry,drawing,places&key=AIzaSyBqtLvddq3jzZ_Lnu9M8266EMVBfXtlUT4:136 at Object. (js?libraries=geometry,drawing,places&key=AIzaSyBqtLvddq3jzZ_Lnu9M8266EMVBfXtlUT4:60) at js?libraries=geometry,drawing,places&key=AIzaSyBqtLvddq3jzZ_Lnu9M8266EMVBfXtlUT4:136 at js?libraries=geometry,drawing,places&key=AIzaSyBqtLvddq3jzZ_Lnu9M8266EMVBfXtlUT4:60 at js?libraries=geometry,drawing,places&key=AIzaSyBqtLvddq3jzZ_Lnu9M8266EMVBfXtlUT4:136 at Sd (js?libraries=geometry,drawing,places&key=AIzaSyBqtLvddq3jzZ_Lnu9M8266EMVBfXtlUT4:63) at Rd.wa (js?libraries=geometry,drawing,places&key=AIzaSyBqtLvddq3jzZ_Lnu9M8266EMVBfXtlUT4:136) at util.js:1
也许你们中的一些人知道,如何在 React 中正确使用此功能... 我在 Google 上找了很久,但一无所获...
Github 上的这个项目 link: https://github.com/hajczek/Neighborhood---Warsaw-Cultural-Map
感谢任何提示:)
所有 DOM 修改都应该通过 React 完成,因为您正在使用它。因此,您应该设置组件的状态,然后根据状态渲染标记,而不是设置 innerHTML(这可能会导致漏洞)。 您可以提取一个呈现 InfoWindow 的组件:
class Popup extends Component {
state = {};
componentDidMount() {
const marker = this.props.marker;
getInfo(marker.title).then(data => {
console.log('---',data);
const link = data[3][0];
const art = data[2][0];
if (link) {
this.setState({
art,
link,
text: "See article in Wikipedia »"
});
} else {
this.setState({
info: "Unfortunately, no info was returned for this data."
});
}
});
geocodeByPlaceId(marker.place_id)
.then(results => {
const address = results[0].formatted_address;
this.setState({ address });
})
.catch(error => console.error(error));
}
render() {
const props = this.props;
return (
<InfoWindow onCloseClick={props.onToggleOpen}>
<div>
<span id="title">{props.marker.title}</span>
<br />
<br />
<span id="address-title">Address:</span>
<br />
<span>{this.state.address}</span>
<br />
<br />
<span>
<em>{this.state.art}</em>
</span>
<br />
<br />
<a target="blank" href={this.state.link}>
{this.state.text}
</a>
<span>{this.state.info}</span>
</div>
</InfoWindow>
);
}
}
并在标记内渲染它:
{i === props.activeKey && (
<Popup marker={marker} onCloseClick={props.onToggleOpen} />
)}
请注意 getInfo
应使用数据解决承诺:
export const getInfo = search => {
return fetch(
"https://pl.wikipedia.org/w/api.php?&origin=*&action=opensearch&search=" +
search +
"&limit=1",
{
headers: { Accept: "application/json" }
}
)
.then(response => response.json())
.catch(e => requestError(e));
上面的示例可能无法正常工作,它只是为了演示该方法。