我是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 });
};
我听说过对象分配,但是我不知道该怎么做。 非常感谢。
答案 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文章,了解有关如何进行不可变更新的更多详细信息。