[英]How to edit specific fields of object in the array at the same time in setState
我们如何在数组中创建对象的特定字段?
这是我想要部分更新的状态数据。
state.items = [
{id:0, left: 100, right: 100, classified: true},
{id:1, left: 200, right: 300, classified: false},
]
这是setState之后的预期结果。
// Edit left, right, classified with given values,
// where the object's id is equal to 1.
state.items = [
{id:0, left: 100, right: 100, classified: true},
{id:1, left: 300, right: 200, classified: true},
]
这是函数内部的代码(问题)
//console.log(id) <- prints 1. We are modifying the second object in the array with id 1.
// iterate items array
let { items } = this.state;
for (var index in items) {
if(items[index].id === id) {
// copy the whole object matching id is 1.
var deep = _.cloneDeep(tag);
//Assign new values (newLeft: 300, newRight:200, newCalssified: true)
deep.left = newLeft
deep.right = newRight
deep.classified = newClassified
this.setState({
// HERE IS THE QUESTION
taggedClothes // how do we modify the object with id 1??
})
}
}
谢谢!!
您需要修改整个items
数组,然后执行setState
来更新整个items
数组。
const items = _.cloneDeep(this.state.items);
// Find index to modify
const index = items.findIndex(i => i.id === id);
items[index].left = newLeft;
items[index].right = newRight;
items[index].classified = newClassified;
this.setState({items});
编辑:如下所述,改变状态并不总是一个好主意。 我在开头添加了一个_.cloneDeep
,但是看看这篇文章了解更多信息和其他选项: React:如何在setState上更新state.item [1]? (用JSFiddle)
@klugjo的答案是正确的,但要更改引用,要对当前状态进行深度克隆以更改状态:
const {items} = _.cloneDeep(this.state);
// Find index to modify
const index = items.findIndex(i => i.id === id);
items[index].left = newLeft;
items[index].right = newRight;
items[index].classified = newClassified;
this.setState({ items });
如前面的答案中所述,您必须修改整个items
数组。 这是使用reduce
以更清洁的方式执行相同操作的另一种方法。
this.setState({
items: this.state.items.reduce(function(acc, item) {
if (item.id === id) {
item.left = newLeft;
item.right = newRight;
item.classified = newClassified;
}
acc.push(item);
return acc;
}, [])
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.