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

Arrays 当状态为对象数组时如何更新特定值-React,arrays,reactjs,Arrays,Reactjs,我是ReactJs的新手,我正在尝试为ipotetic电子商务做一个简单的总结:当你添加一个产品时,你需要知道它是否已经存在,在这种情况下,只增加商品号 如您所见,如果行不存在,我将执行concat(行),它是一个对象 { id: singleProd.id, name: singleProd.name, price: singleProd.price, value: 1 } ),但如果存在,我只需要增加value属性 state = {

我是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 });
  };
我听说过对象分配,但我不知道怎么做。 非常感谢


看起来您只是试图用匹配的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) });
  }
};

不要突变状态

在您的示例中,您正在修改现有的状态对象,它是一个 坏习惯

正确的做法是考虑现有状态计数器不变。然后生成一个全新的计数器数组

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文档中的文章,了解有关如何进行不可变更新的更多详细信息

完美,这适用于状态:现在我唯一的问题是基于数组更新贴图组件…为什么它正在更新concat,而没有使用对象分配进行更新?你是说如果找不到现有行,它就不会更新吗?在检查长度是否为!==0看这里:非常感谢!现在,正如您从图像中看到的,我可以更改组件和产品的值!谢谢提示:如果我理解正确,最好创建一个副本并分配它?正如我所说,我是新的反应,谢谢你的帮助!