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

ReactJS点击按钮打开div、map遍历下所有行按钮点击事件被触发问题

问题原因与修复方案

核心问题

  • 所有行共用同一个布尔状态控制显隐:遍历渲染行时,所有行的菜单显隐都绑定同一个list状态,状态变更会触发所有行同步切换,因此会出现点击一个按钮所有行菜单都触发的问题
  • 点击事件逻辑错误:handleClick中无论if(e.target.value)判断是否生效,末尾都会执行一次setList(!list);如果判断条件命中,状态会被连续翻转两次回到原值,会出现点击无响应的问题

修复实现

  1. 调整状态类型:将布尔类型的list替换为存储当前展开行的唯一标识(如每行数据的id),初始值设为null
const [activeRowId, setActiveRowId] = useState(null)
  1. 遍历渲染时传入行唯一标识:假设遍历的数据源为dataList,每行数据有唯一id字段
{dataList.map(item => (
  <TableCell key={item.id}>
    <Button 
      className='active-select-option'
      onClick={(e) => handleClick(e, item.id)}
    >
      Actions
    </Button>
    {activeRowId === item.id ?                                                
    <div className="select-option">
      <ul className="select-option-inner rounded">
        <li>Buy More</li>
        <li>Sell </li> 
        <li>Next Li Tag</li> 
        <li>Edit Detials</li>
      </ul> 
    </div> : null }
  </TableCell>
))}
  1. 修正点击事件逻辑:
const handleClick = (e, rowId) => {
  e.preventDefault()
  setActiveRowId(prev => prev === rowId ? null : rowId)
}

内容的提问来源于stack exchange,提问作者Shilpa Shivaprakash

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:54:04