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

axios.delete仅删除表格最后一个用户而非点击对应用户如何解决

问题根因

你当前的问题核心是所有行的删除模态框共用了同一个全局的open状态:

  • 你将<DeleteUser />组件放在了遍历用户的map循环内部,每一行用户都会生成一个对应的删除模态框
  • 所有模态框的open属性都绑定了同一个状态变量,点击任意行的删除按钮把open设为true后,所有行的模态框都会同时打开
  • Material UI的Modal组件默认层级是后渲染的更高,所以你能看到的永远是最后一行用户对应的模态框,点击删除时拿到的自然是最后一个用户的id

修复方案

优化状态逻辑,仅用一个全局模态框复用即可,不需要为每行单独生成模态框:

第一步:修改TableComponent的状态逻辑

将原来的布尔类型open状态,替换为存储当前选中要删除的用户id:

// 替换你原来的 open 状态定义
const [selectedDeleteId, setSelectedDeleteId] = useState(null);
// 关闭模态框的方法
const handleCloseDeleteModal = () => setSelectedDeleteId(null);

第二步:修改遍历部分的删除按钮逻辑

把<DeleteUser />从map循环中移除,删除按钮仅负责赋值要删除的用户id:

{/* 原来的删除按钮部分修改为 */}
<button onClick={() => setSelectedDeleteId(apiData.id)}>
  <AiFillDelete />
</button>

第三步:全局只保留一个DeleteUser组件

在整个表格组件的外部(和表格同级)放置唯一的DeleteUser组件:

{/* 表格代码结束后添加 */}
<DeleteUser
  open={!!selectedDeleteId}
  userID={selectedDeleteId}
  onClose={handleCloseDeleteModal}
/>

可选优化:DeleteUser组件补充关闭逻辑

删除成功后调用onClose关闭模态框即可:

const handleDeleteUser = (id, onClose) => {
  axios
    .delete(`https://gorest.co.in/public/v1/users/${id}`, {
      headers: {
        Authorization: "Bearer my token goes here",
      },
    })
    .then((response) => {
      console.log(response);
      onClose(); // 删除成功后关闭模态框
      // 这里可以补充刷新用户列表的逻辑
    });
};

const DeleteUser = ({ open, onClose, userID }) => {
  return (
    <Container>
      <Modal open={open} onClose={onClose}>
        <Box sx={style}>
          <h1>确认删除</h1>
          <button onClick={() => handleDeleteUser(userID, onClose)}>Delete</button>
        </Box>
      </Modal>
    </Container>
  );
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 23:57:01