繁体   English   中英

如何在setState中同时编辑数组中对象的特定字段

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM