当状态是对象数组时如何更新特定值-React

时间:2019-03-26 01:56:58

标签: arrays reactjs

我是ReactJs的新手,我正在尝试为ipotetic电子商务做一个简单的摘要篮:添加产品时,您需要知道它是否已经存在,在这种情况下,仅增加商品编号。

如您所见,如果该行不存在,我会执行concat(行是对象

{ 
  id: singleProd.id, 
  name: singleProd.name, 
  price: singleProd.price,              
  value: 1 
}

),但如果存在,我只需要增加value属性

state = {
    counters: []
  };

  addCounter = row => {
    let countersRows = this.state.counters;
    let existRow = countersRows.filter(c => c.id === row.id);

    if (existRow.length !== 0) {
      let index = countersRows.findIndex(x => x.id === existRow[0].id);
      console.log("Update here... like this.state.counters[index].value + 1?");
    } else {
      this.setState({ counters: countersRows.concat(row) });
    }
  };

  deleteRow = counterId => {
    const counters = this.state.counters.filter(c => c.id !== counterId);
    this.setState({ counters });
  };

我听说过对象分配,但是我不知道该怎么做。 非常感谢。

enter image description here

2 个答案:

答案 0 :(得分:0)

您似乎只是想增加具有匹配ID的第一项的value属性。如果是这样,这是您想要的吗?

addCounter = row => {
  const { counters } = this.state;
  const existingRow = counters.filter(c => c.id === row.id)[0];

  if (existingRow.length !== 0) {
    this.setState(
      Object.assign(existingRow, { value: existingRow.value + 1 })
    );
  } else {
    this.setState({ counters: counters.concat(row) });
  }
};

答案 1 :(得分:0)

请勿更改状态!

  

在您的示例中,您正在突变现有的状态对象,这是一个   坏习惯。

执行此操作的正确方法是考虑现有状态计数器不变。然后生成一个全新的计数器数组。

addCounter = row => {

  const { counters } = this.state;

  //map creates a brand new array
  let newCounters = counters.map((existingRow, index) => {
      if(index === row.id){
          if (existingRow.length !== 0) {
              //Using Object assign Copies all values  from existing row and the object literal to a brand new object
              //return Object.assign({}, existingRow, { value: existingRow.value + 1 });
              //Also instead use the spread operator for more clarity
              return {
                  ...existingRow,
                  value: existingRow.value+1
              };
          } else {
              return row;
          }
      }

      //Just return all other object
      return item;
  });

  this.setState({ counters : newCoutners });
}

查看Redux文档中的this文章,了解有关如何进行不可变更新的更多详细信息。