React中如何更新数组状态指定索引的对象?
React状态数组指定索引对象更新的问题
你的这段写法不正确,问题出在两点:
- 直接修改了原状态:React要求状态是不可变的,
prev[index] = {...}这种赋值操作直接篡改了prev对应的原状态数组,会导致React无法检测到状态变化,组件不会触发重新渲染。 - 返回值类型错误:
setData需要接收新的数组作为状态值,但你这里返回的是prev[index]赋值后的单个对象,最终会让data的类型从数组变成对象,完全偏离预期。
关于你问的「是否可以不借助临时变量直接更新」:可以,但必须遵循不可变更新原则,通过创建新数组来完成状态更新,下面是两种常用的无临时变量写法:
写法1:利用数组map方法
const handleAddChange = (e) => { setData(prev => prev.map((item, i) => i === index ? {...item, [e.target.name]: e.target.value} : item )) }
map会返回一个全新数组,遍历到目标索引时返回更新后的新对象,其余索引直接返回原对象,全程不修改原状态。
写法2:结合展开运算符与slice
const handleAddChange = (e) => { setData(prev => [ ...prev.slice(0, index), {...prev[index], [e.target.name]: e.target.value}, ...prev.slice(index + 1) ]) }
通过slice截取目标索引前后的数组片段,再和更新后的新对象拼接成新数组,同样没有修改原状态数组。
内容的提问来源于stack exchange,提问作者Ahsan Amin
相关产品推荐
相关产品推荐

