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

React购物列表删除指定索引元素后组件未更新渲染问题

错误原因

1. splice 方法调用逻辑错误

splice 会直接修改调用它的原数组,返回值是被删除元素组成的数组,而非修改后的原数组。你现有代码中的setState((prev) => [...prev.splice(idx, 1)])等价于把被删掉的元素组装成新数组赋值给状态,所以点击删除Apple时,状态被设置为[{name: 'Apple', price: 60}],就会出现要删的元素保留、其他元素消失的现象。

2. 数组下标作为key的潜在问题

动态增删的列表使用数组下标作为key,会导致React虚拟DOM Diff算法匹配元素时出现错乱,后续列表条目变多后还会出现更多渲染异常,建议使用业务唯一标识作为key。


修复方案

直接用filter方法生成删除指定下标后的新数组即可,同时替换key的取值、删除冗余的空标签节点:

import React, { useState } from 'react';
import { CButton, CDeleteButton } from '@custom/pkg';

const ShoppingList = () => {
    const [state, setState] = useState(
        [{ name: 'Apple', price: 60 }, { name: 'Banana', price: 20 }]
    )

    return (
        <>
            <h2>Product List</h2>
            {state.map(({name, price}, idx) => (
                <div key={name}>
                    <div>{name}</div>
                    <div>{price}</div>
                    <div>
                        <CButton id={idx} onClick={() => {
                            setState((prev) => prev.filter((_, index) => index !== idx))
                        }}>
                            <CDeleteButton/>
                        </CButton>
                    </div>
                </div>
            ))}
        </>
    )
}

export default ShoppingList;

如果你的商品数据后续会有重名的情况,给每个商品加唯一的id字段,把key换成id即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 18:15:02