3 回答

TA贡献2036条经验 获得超8个赞
首先改变这个
{this.state.myrecords[CompanyName].map((product, i) => (
至
{this.state.myrecords[CompanyName].map((product, j) => (
因为我们已经在上面的地图中使用了i。
然后改变这个
onChange={(e) => this.onChangeQty(product["SparePartID"], e)}
至
onChange={(e) => this.onChangeQty(CompanyName, j, e)}
然后你的onChange应该是
onChangeQty(CompanyName,j,e)
{
const items = {...this.state.myrecords};
items[CompanyName][j].Qty = e.target.value;
items[CompanyName][j].TotalPrice = e.target.value * items[CompanyName][j].Price;
this.setState({
myrecords: items
});
}
如果您不喜欢基于Change的索引,也可以按照以下方式(基于SID)进行操作。只需传递CompanyName,sid,e)此功能onChange={(e) => this.onChangeQty:
onChangeQty(CompanyName,sid,e)
{
const items = {...this.state.myrecords};
const j = items[CompanyName].findIndex(item => item.SparePartID === sid);
items[CompanyName][j].Qty = e.target.value;
items[CompanyName][j].TotalPrice = e.target.value * items[CompanyName][j].Price;
this.setState({
myrecords: items
});
}
警告:代码未经测试。请检查并让我知道 :)

TA贡献1810条经验 获得超4个赞
问题是this.state.myrecords一个对象,因此我们不能直接使用find它。另外,您还需要使用更新程序功能(有关更多详细信息,请参阅doc)。
您的问题的解决方案是:在onChange函数中也传递companyName,然后仅运行特定公司详细信息数组的循环。传递公司名称将帮助您轻松更新状态,否则,您需要在所有阵列上运行循环。
像这样:
onChange={(e) => this.onChangeQty(product["SparePartID"], CompanyName, e)}
onChangeQty(sid, companyName, e) {
const value = e.target.value;
this.setState(prevState => {
return {
myrecords: {
...prevState.myrecords,
[companyName]: prevState.myrecords[companyName].map(el => {
if(el.SparePartID === sid) {
return { ...el, Qty: value, TotalPrice: (el.price * value) }
}
return el;
});
}
}
};
}
添加回答
举报