本文详解 react 中安全删除 state 数组元素的核心原则——必须基于最新状态快照进行操作,并区分 `value` 与 `defaultvalue` 在受控/非受控输入中的关键影响。
在 React 中,直接使用索引(如 splice)从 state 数组中删除元素时,若未正确依赖上一次状态快照,极易因异步更新和闭包捕获过期值而导致“删错项”——例如本例中点击删除第 2 条数据,却意外移除了最后一条。根本原因在于:setState 是异步且可能批处理的,而闭包中引用的 gridData 可能已是陈旧快照。
正确的做法是始终通过函数式更新(setGridData(prev => {...}))获取最新状态,并在此基础上执行不可变操作。推荐使用 filter 而非 splice,因其天然符合不可变范式,语义清晰且无副作用:
const delData = (ndx) => {
setGridData((prevGridData) => ({
...prevGridData,
data: prevGridData.data.filter((_, index) => index !== ndx)
}));
};此外,示例中暴露的另一个关键陷阱是 的属性选择:

最佳实践总结:
遵循以上原则,即可彻底规避数组删除中的常见竞态与渲染错位问题。