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

如何在React中正确删除数组元素并解决子组件状态异常问题

问题根因

你遇到的子组件数量状态匹配错误的问题,核心原因是列表渲染时使用了数组下标index作为key属性。

原因说明

React在对列表进行重渲染的diff比对时,会以key作为组件实例的唯一识别标识。当你删除第一个商品(下标为0的Mocasines Pastoret 01)后,原列表中下标为1、2的商品会变成新列表的下标0、1。
此时React会认为你没有删除第一个CartItem组件,只是更新了组件的传入属性,直接复用了原第一个CartItem的组件实例,也保留了它内部维护的productCount状态(你设置的7),只是把传入的cartItem改成了原来第二个商品的信息,最终就出现了状态和商品不匹配的现象。

解决方案

把CartList中列表渲染的key值替换为每个商品唯一的、固定不变的业务标识即可,你的场景下商品名称是唯一的,可以直接用名称作为key:

// 修改CartList的map部分代码
{itemList.map((cartItem, index) => (
    <CartItem
        removeItem={removeItem}
        index={index}
        key={cartItem.name} // 替换原来的key={index.toString()}
        cartItem={cartItem}
    />
))}

注意事项

只要列表存在增删、排序、过滤这类会改变元素下标的操作,禁止使用数组下标作为key,必须使用业务层面的唯一ID、唯一名称这类固定标识作为key,才能保证组件实例和业务数据一一对应,不会出现内部状态错乱的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 17:51:01