所以这是我的状态:
this.state = {
ids: ['A', 'E', 'C']
};
我将如何修改状态,以便将索引 1 处的“E”更改为“B”?例如:
this.setState({
ids[1]: 'B'
});
这将如何完成?
所以这是我的状态:
this.state = {
ids: ['A', 'E', 'C']
};
我将如何修改状态,以便将索引 1 处的“E”更改为“B”?例如:
this.setState({
ids[1]: 'B'
});
这将如何完成?
我的建议是习惯使用不可变操作,这样你就不要修改内部状态对象。
正如react文档中所指出的:
永远不要直接改变 this.state,因为之后调用 setState() 可能会替换你所做的改变。将 this.state 视为不可变的。
在这种情况下,您可以[1]使用slice()
获取Array的新副本,[2]操作该副本,然后[3]使用新 Array 设置状态。这是一个很好的做法。
类似的东西:
const newIds = this.state.ids.slice() //copy the array
newIds[1] = 'B' //execute the manipulations
this.setState({ids: newIds}) //set the new state
案例1:如果你知道索引,那么你可以这样写:
let ids = [...this.state.ids]; // create the copy of state array
ids[index] = 'k'; //new value
this.setState({ ids }); //update the value
情况 2:如果您不知道索引,则首先使用array.findIndex或任何其他循环来获取要更新的项目的索引,然后更新值并使用 setState。
像这样:
let ids = [...this.state.ids];
let index = ids.findIndex(el => /* condition */);
ids[index] = 'k';
this.setState({ ids });
这是在 setState 中更改数组特定索引的另一种解决方案:
this.setState({
...array,
Object.assign([...array], { [id]: yourNewObjectOrValue })
})
基于@mayank-shukla 所写的内容(案例 2:知道要替换的项目的索引),这也可以用Array.splice编写:
const replacement = 'B';
let copy = [...this.state.ids]
copy.splice(index, 1, replacement)
this.setState({
ids: copy,
})
这里要注意两点:
Array.splice
是突变的;它会改变它正在操作的数组,但由于扩展运算符,这是数组的浅拷贝。更多关于下面的内容。Array.splice
实际上是已删除的元素。又名:不要将切片的结果分配给您打算分配给 中的 ID 的变量setState
,否则您最终只会得到已删除的值。要跟进第 1 项中的浅拷贝和深拷贝,请注意,如果您要替换对象引用(与问题中的字符串文字),您将需要使用类似lodash 的 cloneDeep 之类的东西。
不过,还有一些其他方法可以解决这个问题。
您还可以阅读有关SO 本身的浅与深的更多信息。