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

React中使用splice配合indexOf删除数组元素时仅保留首个元素的问题

问题原因及修复方案

核心错误点

  • 误用splice方法的返回值:splice是数组原地修改方法,会直接修改原数组,且返回值是被删除元素组成的数组,而非修改后的原数组。你将splice的返回值直接传给setInputValue,相当于直接把状态覆盖为仅包含被删除元素的数组,导致其余元素全部丢失。
  • 违反React状态不可变原则:直接对属于状态的inputValue调用splice原地修改,React无法正确检测状态变化,会引发渲染异常。
  • 对象数组使用indexOf查找元素不稳定:indexOf依赖引用相等判断,若数组后续重新生成新对象实例,会出现查找失败返回-1的问题。

修复代码

推荐使用filter方法生成新数组完成删除操作,符合React不可变更新的要求:

import React from "react";

function Todo({ element, inputValue, setInputValue }) {
  const deleteHandler = () => {
    // 用函数式更新获取最新状态,根据唯一id过滤要删除的元素
    setInputValue(prev => prev.filter(item => item.id !== element.id));
  };

  const completeHandler = () => {
    console.log(element.id);
    console.log(inputValue.findIndex(item => item.id === element.id));
  };

  return (
    <div className="todo">
      {element.text}{" "}
      <div>
        <button onClick={deleteHandler}>delete</button>{" "}
        <button onClick={completeHandler}>complete?</button>
      </div>
    </div>
  );
}

export default Todo;

如果需要用splice实现,要先拷贝原数组再操作:

const deleteHandler = () => {
  const newInputValue = [...inputValue];
  const targetIndex = newInputValue.findIndex(item => item.id === element.id);
  if (targetIndex > -1) {
    newInputValue.splice(targetIndex, 1);
    setInputValue(newInputValue);
  }
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 03:54:02