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

ReactJS点击产品按钮仅打开对应特定下拉菜单问题求解

问题根因

所有产品的下拉菜单共用了同一个isComponentVisible布尔状态,只要状态为真,所有菜单的show属性都会被判定为真,自然全部同步展开。

修改方案

调整状态定义

将原有的布尔类型状态改为存储当前激活的产品ID,实现每次仅展开一个对应菜单的效果:

// 替换原有类似 const [isComponentVisible, setIsComponentVisible] = useState(false) 的定义
const [activeProductId, setActiveProductId] = useState(null)

修改toggle触发逻辑

const toggle = (id) => {
  // 点击已展开的产品按钮则关闭菜单,否则切换为当前点击的产品ID
  setActiveProductId(prev => prev === id ? null : id)
}

修正渲染逻辑

<div>
  {products.map((value) => (
    // key需放在map循环返回的最外层根元素上,修正原写法的key位置错误
    <div key={value.id}>
      <DropdownMenu show={activeProductId === value.id} ref={ref}>
        {value.name}
      </DropdownMenu>
      <div>{value.name}</div>
      <button type="button" onClick={() => toggle(value.id)}>
        Open
      </button>
    </div>
  ))}
</div>

扩展方案(支持同时展开多个菜单)

如果需要支持同时打开多个下拉菜单,可以将状态改为存储所有产品显隐状态的对象:

// 状态定义
const [visibleMap, setVisibleMap] = useState({})

// toggle逻辑
const toggle = (id) => {
  setVisibleMap(prev => ({
    ...prev,
    [id]: !prev[id]
  }))
}

// 菜单show属性改为
show={!!visibleMap[value.id]}

内容的提问来源于stack exchange,提问作者Gray Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 09:45:03