因此,这里是我的状态:如何编辑状态数组中的项目?
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 docs指出:
不要直接变异this.state,如调用的setState()之后可能 代替您作出的突变。 将this.state视为不可变的 。
在这种情况下,您可以[1]使用slice()
得到阵列的新副本,[2]操纵副本里,然后,[3]的setState与新阵列。这是一个很好的实践。
类似的东西:
let 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 });
建立在什么@ mayank - 舒克拉写道(案例2:知道更换项目的索引),这可能也与Array.splice写成:
const replacement = 'B';
let copy = [...this.state.ids]
copy = copy.splice(index, 1, replacement)
this.setState({
ids: copy,
})
有两点需要注意,在这里:
Array.splice
是变异;它会改变它所操作的数组,但由于扩展运算符的原因,这是数组的浅层副本。更多关于下面的内容。Array.splice
实际上是删除的元素。 AKA:不要将您的切片的结果分配给您打算分配给setState
中的ID的变量,否则您将只以删除的值结束。从第1项上浅VS深层副本跟进,请注意,如果您要更换对象引用(VS在这个问题字符串)中,您将需要使用像lodash's cloneDeep。但是,有handful of other ways around this。
您还可以阅读更多关于SO itself浅与深。
我认为该行的含义是这样的:'this.state.a ='a'',不要直接改变任何状态变量的值。 **将this.state视为不可变**,总是使用'setState'来更改状态值。纠正我,如果我错了? –
数组是JS中的对象,因此它们通过*“reference”*传递(如果您使用新字符串设置状态键,则不会出现问题)。但是从'this.state'修改相同的数组/对象将会改变同一个内部对象。 – mrlew
哦,得到了点谢谢:) –