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

React JS CRUD表格删除问题:获取选中项ID并传参

问题分析

你的核心问题是删除按钮的点击事件没有获取到当前行的正确ID:

  • 你传入handleDeleteProduct(info.id)时,info是一个数组,数组本身没有id属性,所以传递的id必然是undefined。
  • 你的CRUDTable组件应该是遍历data={info}来渲染每一行,但你直接把一个固定的deleteIcon传给组件,这个图标无法感知当前渲染的是哪一行数据,自然拿不到对应ID。
解决方案

有两种可行的解决思路,优先推荐第一种(更符合组件设计规范):

思路1:修改CRUDTable组件,支持传递删除回调

把deleteIcon和点击逻辑拆分开,让CRUDTable接收一个onDelete回调函数,组件内部渲染每一行时,把当前行的id作为参数传给这个回调:

父组件修改:

// 原deleteIcon的props替换成onDelete回调
<CRUDTable
    data={info} 
    link={`/user-projets-details/`} 
    pencilIcon={<IoPencil style={{fontSize: '18px', cursor: 'pointer', color: 'green'}}/>}
    eyeIcon={<IoEyeOutline style={{fontSize: '18px', cursor: 'pointer', color: '#f8c408'}}/>}
    onDelete={handleDeleteProduct} // 传递删除回调
    deleteIcon={<IoTrashOutline style={{fontSize: '18px', color: 'red', cursor: 'pointer'}} />} // 只传图标组件,不带onClick
/>

CRUDTable组件内部修改(假设原组件遍历逻辑如下):

const CRUDTable = ({ data, deleteIcon, onDelete }) => {
  return (
    <table>
      {data.map(item => (
        <tr key={item.id}>
          {/* 其他列渲染逻辑 */}
          <td>
            {/* 给图标绑定onClick,传入当前行的id */}
            {React.cloneElement(deleteIcon, { onClick: () => onDelete(item.id) })}
          </td>
        </tr>
      ))}
    </table>
  )
}

思路2:如果无法修改CRUDTable,动态生成带绑定ID的deleteIcon

如果不能修改CRUDTable组件,可以在生成info数组时,给每个对象添加绑定了当前行ID的deleteIcon:

const info = pendingList.map(item => {
  return {
    id: item._id,
    produit: item.produits,
    marque: item.marque,
    référence: item.référence,
    installation: item.annéeInstallation,        
    entretenu: item.entretenu,
    année: item.selectedYearEntretenu,
    // 给每个条目生成带onClick的删除图标
    deleteIcon: <IoTrashOutline style={{fontSize: '18px', color: 'red', cursor: 'pointer'}} onClick={() => handleDeleteProduct(item._id)} />
  }
});

// 传递给CRUDTable时不再单独传deleteIcon
<CRUDTable
    data={info} 
    link={`/user-projets-details/`} 
    pencilIcon={<IoPencil style={{fontSize: '18px', cursor: 'pointer', color: 'green'}}/>}
    eyeIcon={<IoEyeOutline style={{fontSize: '18px', cursor: 'pointer', color: '#f8c408'}}/>}
/>
额外修复点

你的handleDeleteProduct里更新pendingList时,过滤条件有误:原pendingList中的条目ID是_id,不是id,所以需要修改过滤逻辑:

setPendingList(pendingList.filter(item => item._id !== id));

内容的提问来源于stack exchange,提问作者Ons Jannet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 15:05:33