react-map-gl中如何实现点击单个Marker仅打开对应Popup的功能?
解决方案
核心思路是将原本存储布尔值的弹窗状态,替换为存储当前被点击Marker对应的唯一标识,这样就能精准匹配要打开的弹窗。
具体修改步骤:
- 调整状态初始化,将
popupOpen改为存储激活弹窗的ID,默认值设为null - Marker点击时,把当前对应地标的唯一ID写入状态
- Popup的显示判断逻辑改为匹配状态存储的ID和当前地标ID
- 关闭弹窗时将状态重置为
null
修改后完整代码:
// state const [popupOpen, setPopupOpen] = useState(null); // marker & popup {landmarkData.map((data, index) => ( <div key={data._id}> <Marker key={index} longitude={data.longitude} latitude={data.latitude} onClick={() => setPopupOpen(data._id)} > <RoomIcon fontSize="small" style={{fill: "red"}} /> </Marker> {popupOpen === data._id && ( <Popup key={index} latitude={data.latitude} longitude={data.longitude} onClose={() => setPopupOpen(null)} closeButton={true} offsetLeft={10} > <span style={{fontSize: "1vw", fontFamily: "Poppins"}}> {data.name} </span> </Popup> )} </div> ))}
说明
原来的布尔类型状态只能控制全局「开/关」两种状态,所有弹窗共用同一个判断条件就会出现一点全开的问题。替换为ID匹配的逻辑后,只有ID和状态值完全一致的弹窗才会渲染,完美实现点击对应Marker才弹出对应弹窗的需求。
内容的提问来源于stack exchange,提问作者starbvuks
相关产品推荐
相关产品推荐

