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

React.js中如何实现点击删除按钮移除对应卡片功能?

我来帮你搞定这个删除功能的实现~其实核心就是通过过滤state数组来移除目标项,结合你现有的确认弹窗逻辑就能完成,具体步骤和代码示例如下:

核心思路

当用户点击红色叉号按钮时,先弹出确认窗口;用户确认删除后,我们需要从tasklist这个state数组中过滤掉对应的任务项,然后更新state触发组件重新渲染。

关键步骤与代码实现

1. 确保任务项有唯一标识

首先,你的tasklist数组里的每个任务对象最好带有唯一的id字段(如果没有的话,建议在添加任务时生成,比如用Date.now()或者uuid),这是可靠删除的基础(避免用数组index作为删除依据,因为index会随数组变化而改变)。

2. 绑定删除事件并实现处理函数

下面分别给出函数组件和类组件的完整实现示例:

函数组件示例(React Hooks)

import React, { useState } from 'react';

const TaskCardList = () => {
  // 初始化带唯一id的任务列表state
  const [tasklist, setTasklist] = useState([
    { id: 1, username: '张三' },
    { id: 2, username: '李四' },
    { id: 3, username: '王五' }
  ]);

  // 删除处理函数:接收要删除任务的id
  const handleDeleteTask = (taskId) => {
    // 弹出确认窗口
    const isConfirmDelete = window.confirm('你确定要删除吗');
    if (isConfirmDelete) {
      // 过滤掉目标任务,生成新数组(React要求state不可变,不能直接修改原数组)
      const updatedTaskList = tasklist.filter(task => task.id !== taskId);
      // 更新state,触发组件重新渲染
      setTasklist(updatedTaskList);
    }
  };

  return (
    <div className="task-container">
      {/* 遍历渲染每个任务Card */}
      {tasklist.map(task => (
        <div key={task.id} className="user-card">
          <span className="username">{task.username}</span>
          {/* 红色叉号删除按钮,绑定点击事件并传递当前任务id */}
          <button
            className="delete-btn"
            onClick={() => handleDeleteTask(task.id)}
            style={{ color: 'red', border: 'none', background: 'transparent', cursor: 'pointer', fontSize: '1.2rem' }}
          >
            ×
          </button>
        </div>
      ))}
    </div>
  );
};

export default TaskCardList;

类组件示例

如果你还在使用类组件,代码逻辑类似,只是state的更新方式不同:

import React, { Component } from 'react';

class TaskCardList extends Component {
  constructor(props) {
    super(props);
    this.state = {
      tasklist: [
        { id: 1, username: '张三' },
        { id: 2, username: '李四' },
        { id: 3, username: '王五' }
      ]
    };
    // 绑定this到处理函数(避免箭头函数的话可以这么做)
    this.handleDeleteTask = this.handleDeleteTask.bind(this);
  }

  handleDeleteTask(taskId) {
    const isConfirmDelete = window.confirm('你确定要删除吗');
    if (isConfirmDelete) {
      // 使用prevState确保获取最新的state值
      this.setState(prevState => ({
        tasklist: prevState.tasklist.filter(task => task.id !== taskId)
      }));
    }
  }

  render() {
    return (
      <div className="task-container">
        {this.state.tasklist.map(task => (
          <div key={task.id} className="user-card">
            <span className="username">{task.username}</span>
            <button
              className="delete-btn"
              onClick={() => this.handleDeleteTask(task.id)}
              style={{ color: 'red', border: 'none', background: 'transparent', cursor: 'pointer', fontSize: '1.2rem' }}
            >
              ×
            </button>
          </div>
        ))}
      </div>
    );
  }
}

export default TaskCardList;

3. 注意事项

  • key的使用:遍历渲染列表时,一定要用任务的唯一id作为key,不要用数组的index,这样能避免删除任务后出现的渲染异常,同时提升列表渲染性能。
  • state不可变性:React中不能直接修改原state数组(比如用splice),必须通过生成新数组的方式(比如filter、map)来更新state,这样React才能正确检测到state变化并重新渲染组件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:58:38