Все модификации 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));
Приведенный выше пример, вероятно, не будет работать, это демонстрация подхода.