javascript - 反应:无法根据目标正确更新数组
问题描述
如果有人可以帮助我,我将不胜感激。
目标:如果通过单击“+”添加的项目:
- 它需要检查订单是否已经存在(如果存在,则增加数量)
- 如果没有,则将该项目附加到订单列表中
fullmenu包含以下架构中所有项目的列表:
{ _id: 5eef61450bd95e1f5c8f372f ,
name: "Burger" ,
category: "American" ,
price: "100" ,
isVeg: false,
qty: 0
}
ISSUE:即使它已经存在于订单数组中,它也会添加一个新的 item 对象,而不是仅仅增加它的数量
主要代码逻辑:
const [total, setTotal] = useState(0);
const [orders, setOrders] = useState([]);
const [fullMenu, setFullMenu] = useState();
const addMore = (e) => {
let sign = e.target.innerText;
let id = e.target.id;
const newOrders = [...orders];
let order = newOrders.find(each => each.id === id);
// if the order already exists for the item
if (order) {
let _sign = sign === "+" ? 1 : -1;
// increase or decrease the quantity
order.qty = (order.qty || 0) + 1 * _sign;
// remove item from order list if qty = 0
if(!order.qty){
setOrders(orders => orders.filter(each => each.id !== id));
// setTotal(total => total - parseInt(order.price));
return;
};
// save
setOrders(newOrders);
if (sign === "+") setTotal(total => total + parseInt(order.price));
if (sign === "-") setTotal(total => total - parseInt(order.price));
return;
};
// if item doesn't exist in the order list
const item = fullMenu.find(each => each._id === id);
if (sign === "+") {
order = {
...item, qty: 1
};
setOrders(orders => [...orders, order]);
setTotal(total => total + parseInt(order.price));
};
}
JSX:
<div className="col-sm-4"><span id={each._id} onClick={addMore} category={each.category}>-</span></div>
<div className="col-sm-4"><FormCheckLabel className="qty" >{each.qty}</FormCheckLabel></div>
<div className="col-sm-4"><span id={each._id} onClick={addMore} category={each.category}>+</span></div>
解决方案
You need to find the order using each._id
not each.id
...
let order = newOrders.find(each => each._id === id);
...
Edit: Another thing noticed was that you were mutating the state directly
Refactored code
const addMore = (e) => {
let sign = e.target.innerText;
let id = e.target.id;
const newOrders = [...orders];
let orderIndex = newOrders.findIndex((each) => each._id === id); //<---use correct ._id
if (orderIndex !== -1) {
let _sign = sign === "+" ? 1 : -1;
// order.qty = (order.qty || 0) + 1 * _sign; //<----don't mutate like this
const updatedOrder = {...newOrders[orderIndex]};
updatedOrder.qty = (updatedOrder.qty || 0) + 1 * _sign;; //<---update state like this
if (!updatedOrder.qty) {
setOrders((orders) => orders.filter((each) => each._id !== id)); //<---use correct ._id
return;
}
// save
newOrders[orderIndex] = updatedOrder;//<----save updated order like this
setOrders(newOrders);
if (sign === "+") setTotal((total) => total + parseInt(order.price));
if (sign === "-") setTotal((total) => total - parseInt(order.price));
return;
}
const item = fullMenu.find((each) => each._id === id);
if (sign === "+") {
order = {
...item,
qty: 1,
};
setOrders((orders) => [...orders, order]);
setTotal((total) => total + parseInt(order.price));
}
};
推荐阅读
- python - NAOqi 未找到 SignalLink 订阅
- sql - 尝试在 SPARK (Scala) 中收集 SQL 查询结果时出错
- postgresql - 无法使用 pgAdmin 连接到服务器 PostgreSQL 数据库
- angular - 字段退出后和字段中的角度表单字段验证
- raspberry-pi - 当类作为 Raspberry Pi 上的 python 对象传递时找不到相机
- javascript - 如何在为生产运行 npm build 时解决多个块向相同文件名错误(bundle.css)发出资产 [Vue.js]
- python - 在长达一个月的列中概括确认的金额
- azure - 在创建应用程序网关入口时,问题正在发生
- java - 如何使用 Mockito 验证 PreparedStatement 场景。无法在测试类中模拟 PreparedStatement 类
- python - Django:ForeignKey vs related_name