我知道 arrayUnion 不接受重复项,但是如果项目重复,我是否可以阻止这种情况并只更新一个字段(数量)?如果不存在解决方案,也许您对如何构建我的数据以实现这一点有另一个想法。谢谢
这是我尝试这样做的功能(ofc这不起作用,因为异步):
const addProductToCart=async()=>{
const q = query(collection(db, "carts"), where("userUID", "==", user?.uid));
const docRef = await getDocs(q);
if(docRef.docs[0].exists){
console.log('not empty');
let products=docRef.docs[0].data().products;
products.forEach((product)=>{
//product exists
if(product.productUniqueName == uniqueProductName){
//console.log(product)
let cloneProduct=product;
let updateProduct=product;
updateProduct.quantity=product.quantity+1;
console.log('Updated product'+updateProduct);
const currentUserCart=doc(db, 'carts', docRef.docs[0].id);
updateDoc(currentUserCart, {
cartItems: cartItems + 1,
products: arrayRemove(cloneProduct),
products: arrayUnion(updateProduct)
});
return;
}
})
//productUniqueName
let newProduct={};
newProduct.productName=product.name;
newProduct.productBrand=product.brand;
newProduct.price=product.price;
newProduct.size=product.quantity;
newProduct.quantity=1;
newProduct.productUniqueName=uniqueProductName;
newProduct.img=productImages[0];
const currentUserCart=doc(db, 'carts', docRef.docs[0].id);
await updateDoc(currentUserCart, {
cartItems: cartItems + 1,
products: arrayUnion(newProduct)
});
}
else{
console.log('empty');
}
}
没有任何直接的方法可以做到这一点。您必须阅读文档,检查该项目是否已存在于该数组中,如果存在则增加数量并更新整个数组。如果没有,那么您可以将其添加到数组中。
我不确定您是否获取现有的购物车信息以向用户显示。如果您在初始加载时这样做,那么您可以直接从本地状态(存储购物车信息的位置)检查它并相应地更新。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句