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

React.js中如何通过唯一Key删除指定Div?

解决React中删除特定Div时全部清空的问题

你的代码存在几个关键问题导致删除操作触发后所有Div被清空:

  • 错误将JSX元素存入state:React state应存储业务数据而非UI元素,直接存JSX会导致状态追踪混乱,无法精准定位单个元素。
  • 全局变量id重复复用:每次点击添加按钮生成的id会被循环中所有新Div共享,导致所有元素的key完全相同,React无法区分不同元素。
  • 删除逻辑依赖错误标识:handleDelete中用index !== key过滤数组,但key是uuid字符串、index是数字,两者永远不相等,过滤后数组无变化;再通过setItems(items-1)触发重新渲染时,重复的key会让React批量卸载所有元素。

修正后的完整代码

import './App.css';
import { useState } from 'react';
import { v4 as uuidv4 } from 'uuid';

function App() {
  // 存储带唯一id的物品数据数组
  const [items, setItems] = useState([{ id: uuidv4() }]);

  const handleAdd = () => {
    // 追加新的物品数据,生成唯一id
    setItems(prevItems => [...prevItems, { id: uuidv4() }]);
  };

  const handleDelete = (itemId) => {
    // 根据id精准过滤删除目标元素
    setItems(prevItems => prevItems.filter(item => item.id !== itemId));
  };

  return (
    <div className="App">
      {/* 遍历数据数组生成UI元素 */}
      {items.map(item => (
        <div key={item.id} className="subcontainer2">
          <div className="item1">
            <span>Item </span>
            <input type="text" placeholder='item name' className="subinputfields" />
          </div>
          <div className="item2">
            <span>Quantity</span>
            <input type="number" placeholder='1' className="qty" />
          </div>
          <div className="item2">
            <span>Price/Rate</span>
            <input type="number" className='price' name="price" min="0.00" step="0.01" placeholder='&#8377; 0.00' />
          </div>
          <div className="item2">
            <span>Action</span>
            <img 
              src="delete.png" 
              className='deletebtn' 
              onClick={() => handleDelete(item.id)} 
              alt="Delete item" 
            />
          </div>
        </div>
      ))}

      <div onClick={handleAdd} className="addbtn">
        Add Items
      </div>
    </div>
  );
}

export default App;

关键改动说明

  • 用数据数组替代JSX数组:items state存储带唯一id的对象数组,符合React状态管理的最佳实践,便于追踪和修改单个元素。
  • 添加元素直接更新数据:handleAdd通过扩展运算符创建新数组并追加带新uuid的对象,彻底避免全局变量导致的id重复问题。
  • 基于唯一id执行删除:handleDelete接收目标元素的id,通过filter精准移除对应项,不再依赖索引或错误标识。
  • 渲染时绑定唯一key:遍历数据数组生成UI时,用元素自身的id作为key,确保React能正确识别每个元素,避免重复key引发的渲染异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 14:50:22