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

如何实现按钮删除数组项?React子组件删除功能失效排查

功能失效原因

删除按钮不生效是3处代码逻辑错误导致的:

  • 违反React单向数据流规则:list是父组件App维护的state,子组件List无权直接修改props传入的数组,必须通过父组件暴露的更新方法修改状态。
  • 事件绑定写法错误:onClick={handleDelete(listItem.key)}会在组件渲染阶段立即执行handleDelete,而非点击按钮时触发,相当于绑定的是函数执行后的undefined返回值,点击自然无响应。
  • 状态更新逻辑缺失:Array.filter是返回新数组的纯方法,原代码既没有接收filter的返回结果,也没有调用状态更新方法触发重渲染,就算逻辑执行页面也不会有变化。
修复方案

1. 修改父组件App.js

在父组件内定义删除逻辑,将删除方法通过props传递给子组件:

import { useState } from 'react';
import List from './List';

function App() {
  const [input, setInput] = useState("");
  const [list, setList] = useState([]);
  
  const handleSubmit = (e) => {
      e.preventDefault();
      setList([...list, {val: input, key: Date.now()}]); // 替换随机数为时间戳避免key重复
      setInput(""); // 提交后清空输入框,可选优化
  }

  const handleChange = (e) => {
       setInput(e.target.value)
  }

  // 新增删除方法:过滤掉目标key对应的项后更新state
  const handleDelete = (targetKey) => {
    setList(list.filter(item => item.key !== targetKey));
  }

  return(
    <div className='App'>
     <header className='App-header'>
       <div className='Wrapper'>
         <div className='input-container'>
         <input type="text" onChange={handleChange} value={input} />
         <input type="submit" onClick={handleSubmit} />
         </div>
       {/* 传入list数据和删除方法给子组件 */}
       <List list={list} onDelete={handleDelete}/>
       </div>
     </header>
    </div>
  )
}

export default App;

2. 修改子组件List.jsx

删除子组件内无效的handleDelete逻辑,修正onClick绑定写法,调用父组件传入的删除方法:

function List(props) {
  return (
      <>
          {
              props.list.map(function(listItem){
                  return (
                      <div className='lists' key={listItem.key}>
                          <p>
                            {listItem.val}  
                            {/* 用箭头函数包裹逻辑,点击时才触发删除 */}
                            <button onClick={() => props.onDelete(listItem.key)}>Delete</button> 
                          </p>
                      </div>
                  )
              })
          }
      </>
  )
}

export default List

注意:原代码用Math.floor(Math.random() * 11)生成列表key,仅能生成0-10共11个值,添加超过11个列表项时必然出现key重复,会导致React渲染错位、状态异常,建议替换为时间戳、自增ID等全局唯一值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 04:12:22