如何异步更新 React useState 钩子数组
How to asynchronously update React useState hook array
我有订单 window,它会打开模式对话框供用户 select 添加多个产品。比赛时,所有产品均由回调函数handleApplyModalClose传回。在此函数中,为每个产品创建新项目并将其发送到 API。在每个响应中,我都尝试通过调用 addSavedOrderItem 来使用响应数据更新数组 orderItems。
const [orderItems, setOrderItems] = useState<OrderItem[]>([]);
const addSavedOrderItem = (orderItem): void => {
setOrderItems((prevOrderItems) => (
{
...prevOrderItems,
orderItem
}
));
};
const handleApplyModalClose = (products, quantities): void => {
setIsLoading(true);
let count = 0;
const expects = products.length;
products.forEach((prod) => {
const quantity = quantities[prod];
const product = productSelector(productsState, prod);
const { unitsPerCase } = product;
const prodId: number = parseInt(prod, 10);
const oItem = {
product: prodId * 1,
piecesPerBox: 0,
quantityBoxes: quantity * 1,
quantityPieces: quantity * unitsPerCase,
transportPricePerBox: 0.00,
transportPricePerPiece: 0.00
};
createOrderItemApi(order.id, oItem)
.then((response) => {
addSavedOrderItem(response.data);
count += 1;
if (count === expects) setIsLoading(false);
}).catch((error) => {
toast.error('Failed to save order!');
count += 1;
if (count === expects) setIsLoading(false);
});
});
setIsProductPickerOpen(false);
};
我遇到的问题是,当我尝试以这种方式更新 orterItems 数组时,当我打印出订单商品时组件抛出错误:
TypeError: orderItems.map is not a function
这里
const addSavedOrderItem = (orderItem): void => {
setOrderItems((prevOrderItems) => (
{
...prevOrderItems,
orderItem
}
));
};
您正在将状态类型从数组更改为对象,因此出现错误。我想知道为什么打字稿不会尖叫错误的数据类型
我有订单 window,它会打开模式对话框供用户 select 添加多个产品。比赛时,所有产品均由回调函数handleApplyModalClose传回。在此函数中,为每个产品创建新项目并将其发送到 API。在每个响应中,我都尝试通过调用 addSavedOrderItem 来使用响应数据更新数组 orderItems。
const [orderItems, setOrderItems] = useState<OrderItem[]>([]);
const addSavedOrderItem = (orderItem): void => {
setOrderItems((prevOrderItems) => (
{
...prevOrderItems,
orderItem
}
));
};
const handleApplyModalClose = (products, quantities): void => {
setIsLoading(true);
let count = 0;
const expects = products.length;
products.forEach((prod) => {
const quantity = quantities[prod];
const product = productSelector(productsState, prod);
const { unitsPerCase } = product;
const prodId: number = parseInt(prod, 10);
const oItem = {
product: prodId * 1,
piecesPerBox: 0,
quantityBoxes: quantity * 1,
quantityPieces: quantity * unitsPerCase,
transportPricePerBox: 0.00,
transportPricePerPiece: 0.00
};
createOrderItemApi(order.id, oItem)
.then((response) => {
addSavedOrderItem(response.data);
count += 1;
if (count === expects) setIsLoading(false);
}).catch((error) => {
toast.error('Failed to save order!');
count += 1;
if (count === expects) setIsLoading(false);
});
});
setIsProductPickerOpen(false);
};
我遇到的问题是,当我尝试以这种方式更新 orterItems 数组时,当我打印出订单商品时组件抛出错误:
TypeError: orderItems.map is not a function
这里
const addSavedOrderItem = (orderItem): void => {
setOrderItems((prevOrderItems) => (
{
...prevOrderItems,
orderItem
}
));
};
您正在将状态类型从数组更改为对象,因此出现错误。我想知道为什么打字稿不会尖叫错误的数据类型