React 将一个状态数组推入另一个状态数组
React Push One State Array into Another
本质上,我有这个工作,我正在构建一个游戏组件,允许用户 select 他们想要购买的物品,他们被推入待定数组,然后当他们想结帐时我正在将这些对象从 pending 数组推送到 purchased 数组。
但之后发生了一些非常奇怪的事情,数组看起来工作正常,待定数组为空,而购买的数组中包含正确的项目。一旦我尝试单击一个新项目以将其放入待定数组中,如果它与已购买数组中的相同项目改变了那里的计数器,问题就来了。
我一直在尝试用不同的方法来尝试解决这个问题,但如果我不重新设置状态,我不知道它是如何影响购买的阵列的。
到目前为止,这是我运行此供应商功能的代码。
handleMerchantEquipment(item) {
let pending = this.state.merchantPending;
let found = Equipment.find(el => item === el.Name);
let check = pending.find(el => el.Name === found.Name);
if (!check) {
pending.push(found);
}
else {
var foundIndex = pending.findIndex(el => el.Name === check.Name);
check.Count +=1;
pending[foundIndex] = check;
}
let CP = [0];
let SP = [0];
let GP = [0];
let PP = [0];
pending.map(item => {
let cost = item.Cost * item.Count;
if (item.Currency === "CP") {
CP.push(cost);
}
else if (item.Currency === "SP") {
SP.push(cost);
}
else if (item.Currency === "GP") {
GP.push(cost);
}
else if (item.Currency === "PP") {
PP.push(cost);
}
});
let purchased = [];
this.state.merchantPending.map(item => {
purchased.push(item)
});
this.setState({
yourCP: totalCP,
yourSP: totalSP,
yourEP: totalEP,
yourGP: totalGP,
yourPP: totalPP,
purchased: purchased,
merchantPending: [],
});
一些代码与他工作正常的货币兑换有关。
我也尝试过...更新数组,但问题仍然存在,因为它更新了购买状态下的计数。
您希望 purchasedArray 在遇到重复条目或项目时执行什么操作?你可以在你的问题中澄清一下吗?
如果您希望它不允许重复项目,您必须首先检查数组以查看它是否包含该项目。伪代码
if(contains) {
render alert
//or do something else
} else {
purchased.push(item)
}
我无法发表评论,所以当你澄清时我会删除它。
你正在改变状态。你应该 而不是 在 React 中改变状态。在 React 中你应该总是不可变地改变状态。
我认为问题出在这一行。
let pending = this.state.merchantPending;
改为
let pending = [...this.state.merchantPending.map(obj => ({...obj}))];
此外,如果要迭代数组,请使用 forEach
而不是 map
。 map
returns你一个新数组。
pending.forEach(item => {
...
}
本质上,我有这个工作,我正在构建一个游戏组件,允许用户 select 他们想要购买的物品,他们被推入待定数组,然后当他们想结帐时我正在将这些对象从 pending 数组推送到 purchased 数组。
但之后发生了一些非常奇怪的事情,数组看起来工作正常,待定数组为空,而购买的数组中包含正确的项目。一旦我尝试单击一个新项目以将其放入待定数组中,如果它与已购买数组中的相同项目改变了那里的计数器,问题就来了。
我一直在尝试用不同的方法来尝试解决这个问题,但如果我不重新设置状态,我不知道它是如何影响购买的阵列的。
到目前为止,这是我运行此供应商功能的代码。
handleMerchantEquipment(item) {
let pending = this.state.merchantPending;
let found = Equipment.find(el => item === el.Name);
let check = pending.find(el => el.Name === found.Name);
if (!check) {
pending.push(found);
}
else {
var foundIndex = pending.findIndex(el => el.Name === check.Name);
check.Count +=1;
pending[foundIndex] = check;
}
let CP = [0];
let SP = [0];
let GP = [0];
let PP = [0];
pending.map(item => {
let cost = item.Cost * item.Count;
if (item.Currency === "CP") {
CP.push(cost);
}
else if (item.Currency === "SP") {
SP.push(cost);
}
else if (item.Currency === "GP") {
GP.push(cost);
}
else if (item.Currency === "PP") {
PP.push(cost);
}
});
let purchased = [];
this.state.merchantPending.map(item => {
purchased.push(item)
});
this.setState({
yourCP: totalCP,
yourSP: totalSP,
yourEP: totalEP,
yourGP: totalGP,
yourPP: totalPP,
purchased: purchased,
merchantPending: [],
});
一些代码与他工作正常的货币兑换有关。
我也尝试过...更新数组,但问题仍然存在,因为它更新了购买状态下的计数。
您希望 purchasedArray 在遇到重复条目或项目时执行什么操作?你可以在你的问题中澄清一下吗?
如果您希望它不允许重复项目,您必须首先检查数组以查看它是否包含该项目。伪代码
if(contains) {
render alert
//or do something else
} else {
purchased.push(item)
}
我无法发表评论,所以当你澄清时我会删除它。
你正在改变状态。你应该 而不是 在 React 中改变状态。在 React 中你应该总是不可变地改变状态。
我认为问题出在这一行。
let pending = this.state.merchantPending;
改为
let pending = [...this.state.merchantPending.map(obj => ({...obj}))];
此外,如果要迭代数组,请使用 forEach
而不是 map
。 map
returns你一个新数组。
pending.forEach(item => {
...
}