medicines
).medicinesSubmit
, toàn bộ table (ProductHomeRight
) bị render lại.PrescribingMedicine
) cũng bị render lại hết, dù chỉ 1 item thay đổi.👉 Khi medicinesSubmit
thay đổi → hàm getAvailableStock(medicine)
chạy lại cho tất cả thuốc, dẫn đến
PrescribingMedicine
đều re-render vì availableStock
là giá trị mới mỗi lần.useMemo
):"Tính trước mọi availableStock, lưu vào Map, truyền giá trị ổn định."
const availableStockMap = useMemo(() => {
const map = new Map();
medicines.forEach(medicine => {
const existing = medicinesSubmit?.find(item => item.id === medicine.id);
const stock = existing
? Math.max(0, medicine.in_stock - existing.quantity)
: medicine.in_stock;
map.set(medicine.id, stock);
});
return map;
}, [medicines, medicinesSubmit]);
{!medicineLoading && medicines.length > 0 && medicines.map(medicine => (
<PrescribingMedicine key={medicine.id}
availableStock={availableStockMap.get(medicine.id)}
...
/>
))}
const PrescribingMedicine = ({props...}) = {...}
export default React.memo(PrescribingMedicine)