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

React Context数组删除功能异常,相同类型组件总是删除最后一项排查

问题原因

你遇到的渲染异常是React列表渲染key属性使用错误导致的:

  • 你在Board组件的map循环中给外层div绑定的key是数组索引i,当数组中存在多个同类型组件(比如3个Note)时,React的Diff算法会认为索引相同的项是同一个组件,直接复用已有组件实例,只会移除消失的索引对应的DOM。你删除中间某一项后,数组长度减1,最后一个索引消失,视觉上就表现为删除了最后一项;当数组中存在不同类型组件时,组件类型差异会触发React重新渲染对应项,所以删除功能表现正常。
  • 你打印的数组内容正确但渲染不符,就是因为React复用了同类型组件的实例,没有更新时没有替换对应位置的组件内容。
修复方案
  1. 修正列表渲染的key值
    在Board组件的map循环中,把key从索引改为每个元素唯一的id即可:
// 原来的代码
<div key={i}>
// 修改为
<div key={component.id}>
  1. 优化删除逻辑写法(非必须,符合React不可变数据原则,避免潜在问题)
    你当前使用splice直接修改了原state数组,违反了React state不可变的规范,建议改用filter生成新数组:
const deleteComponent = (id: any) => {
  setComponents(components.filter(item => item.id !== id))
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 18:42:02