You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

react-map-gl中如何实现点击单个Marker仅打开对应Popup的功能?

解决方案

核心思路是将原本存储布尔值的弹窗状态,替换为存储当前被点击Marker对应的唯一标识,这样就能精准匹配要打开的弹窗。

具体修改步骤:

  1. 调整状态初始化,将popupOpen改为存储激活弹窗的ID,默认值设为null
  2. Marker点击时,把当前对应地标的唯一ID写入状态
  3. Popup的显示判断逻辑改为匹配状态存储的ID和当前地标ID
  4. 关闭弹窗时将状态重置为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 20:54:00