如何编辑状态数组中的项目?

IT技术 reactjs
2021-05-25 08:40:10

所以这是我的状态:

this.state = {
  ids: ['A', 'E', 'C']
};

我将如何修改状态,以便将索引 1 处的“E”更改为“B”?例如:

this.setState({
  ids[1]: 'B'
});

这将如何完成?

4个回答

我的建议是习惯使用不可变操作,这样你就不要修改内部状态对象。

正如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,
})

REPL 示例

这里要注意两点:

  1. Array.splice 突变的;它会改变它正在操作的数组,但由于扩展运算符,这是数组的浅拷贝。更多关于下面的内容。
  2. 您不能直接分配拼接的结果,因为 的返回值Array.splice实际上是已删除的元素。又名:不要将切片的结果分配给您打算分配给 中的 ID 的变量setState,否则您最终只会得到已删除的值。

要跟进第 1 项中的浅拷贝和深拷贝,请注意,如果您要替换对象引用(与问题中的字符串文字),您将需要使用类似lodash 的 cloneDeep 之的东西

不过,还有一些其他方法可以解决这个问题

您还可以阅读有关SO 本身的浅与深的更多信息