react-leaflet:使用组件作为 GeoJSON 功能的弹出窗口
react-leaflet: Using a Component as a popup on a GeoJSON feature
我当前的用例是我想加载 GeoJSON 数据,并将这些点渲染为地图上的标记。这很好用。
我的下一步是添加一个在点击标记时显示弹出窗口的功能;这个弹出窗口将包含按钮,用户可以按下这些按钮来调用由父组件传递给组件的函数。因此,弹出窗口需要具有交互性。
遗憾的是,将弹出窗口附加到 GeoJSON 标记的唯一方法是使用 onEachFeature
函数,并绑定呈现的 HTML 弹出窗口,如下所示:
const popupNode = <MapPopup marker={marker} closePopup={closePopup} />;
const popupText = ReactDOMServer.renderToString(popupNode);
marker.bindPopup(popupText);
使用renderToString
意味着呈现的弹出窗口不是交互式的,因此不能使用按钮和onClick监听器,也不能调用函数。
我能想到的唯一其他方法是完全独立于地图渲染弹出窗口;拦截弹出事件,获取关联的标记,并在适当的屏幕位置呈现一个组件,并在用户拖动地图时重新对齐它。这将通过完全放弃 Leaflet 现有的弹出代码来重新发明轮子,因此将是一个巨大的痛苦。
但是,我看不到其他绑定弹出窗口的方法。其他解决方案使用 <Popup>
组件,但这需要使用 <FeatureGroup>
组件,这意味着放弃 <GeoJSON>
组件。
我最终放弃了 GeoJSON 组件并使用了 Popup 组件。
我当前的用例是我想加载 GeoJSON 数据,并将这些点渲染为地图上的标记。这很好用。
我的下一步是添加一个在点击标记时显示弹出窗口的功能;这个弹出窗口将包含按钮,用户可以按下这些按钮来调用由父组件传递给组件的函数。因此,弹出窗口需要具有交互性。
遗憾的是,将弹出窗口附加到 GeoJSON 标记的唯一方法是使用 onEachFeature
函数,并绑定呈现的 HTML 弹出窗口,如下所示:
const popupNode = <MapPopup marker={marker} closePopup={closePopup} />;
const popupText = ReactDOMServer.renderToString(popupNode);
marker.bindPopup(popupText);
使用renderToString
意味着呈现的弹出窗口不是交互式的,因此不能使用按钮和onClick监听器,也不能调用函数。
我能想到的唯一其他方法是完全独立于地图渲染弹出窗口;拦截弹出事件,获取关联的标记,并在适当的屏幕位置呈现一个组件,并在用户拖动地图时重新对齐它。这将通过完全放弃 Leaflet 现有的弹出代码来重新发明轮子,因此将是一个巨大的痛苦。
但是,我看不到其他绑定弹出窗口的方法。其他解决方案使用 <Popup>
组件,但这需要使用 <FeatureGroup>
组件,这意味着放弃 <GeoJSON>
组件。
我最终放弃了 GeoJSON 组件并使用了 Popup 组件。