У меня проблема с картами Google InfoBox в приложении React. Моя цель — открыть пустой InfoBox в экземпляре Google Maps, а затем использовать ReactDOM.render, чтобы поместить в него мой компонент. Компонент состоит из набора вкладок, при этом каждая панель вкладок выполняет вызов API через избыточность и преобразователь при ее открытии.
Все работает, показывает красиво. Проблема возникает из-за фактического нажатия на InfoBox. Я могу заставить его работать одним из двух способов, изменив enableEventPropagation на true или false:
enableEventPropagation = true: компонент работает, все вкладки и кнопки, но любые маркеры под моим информационным полем будут открыты, если я случайно нажму на правую часть информационного окна, что полностью нарушит состояние и поток моего приложения.
enableEventPropagation = false: клики не передаются на карту, но тогда ни одно из событий кликов в реагирующем компоненте не работает. Ни вкладок, ни кнопок: ничего. Выглядит отлично, но совсем не работает.
Вот мой код для создания моего InfoBox и рендеринга в него с помощью ReactDOM:
renderInfoBox() {
let {map, google, infoBox} = this.props;
let markerElement = MarkerElementService.getMarkerElement(infoBox.ui.markerId);
this.infoBox = new this.infoBoxClass({
content: this.refs.infoBoxHolder,
enableEventPropagation: false,
pixelOffset: new google.maps.Size(10, -275),
maxWidth: 350,
zIndex: 99999999,
infoBoxClearance: new google.maps.Size(75, 75)
});
ReactDOM.render(
<Provider store={AppStore}>
<ThemeProvider theme={Theme}>
<InfoBoxComponent google={google} onClose={this.closeButtonClicked.bind(this)} />
</ThemeProvider>
</Provider>,
this.refs.infoBoxHolder,
() => {
this.infoBox.open(map, markerElement);
}
);
}
render() {
return (
<div ref="infoBoxHolder" />
);
}
Я пробовал следующие решения:
Переключение на GoogleMaps OverLay. Точно такая же проблема, на самом деле глядя на надстройку InfoBox, кажется, что InfoBox является оболочкой для OverLay, которая помогает устранить некоторые из этих проблем, но все еще предполагает, что она будет неинтерактивной.
Отключение распространения событий в различных точках внутри моих компонентов, но эффект заключается в том, что он отключает распространение событий вниз по дереву DOM, а не вверх, что означает, что дочерние компоненты не работают! Безумный!
Кажется, мой единственный оставшийся вариант — каким-то образом вычислить границы широты/долготы информационного окна после его рендеринга, а затем последовательно отключить все маркеры, которые находятся в этой области, но я хочу избежать этого хакерского вздора!
А может у меня совсем неправильный подход?