import { useEffect, useState } from 'react'; import { View, Text, Input } from '@tarojs/components'; type OrderQtyControlsProps = { value: number; unitLabel: string; onChange: (next: number) => void; }; const MAX_QTY = 999; function parseQty(raw: string): number | null { const n = parseInt(String(raw).replace(/\D/g, ''), 10); if (!Number.isFinite(n)) return null; return Math.min(MAX_QTY, Math.max(1, n)); } /** 下单数量:加减 + 手动输入,旁注单位(瓶/箱) */ export default function OrderQtyControls({ value, unitLabel, onChange }: OrderQtyControlsProps) { const [draft, setDraft] = useState(String(value)); useEffect(() => { setDraft(String(value)); }, [value]); function current(): number { return parseQty(draft) ?? value; } function commit() { const next = parseQty(draft); if (next == null) { setDraft(String(value)); return; } setDraft(String(next)); if (next !== value) onChange(next); } return ( 购买数量 onChange(Math.max(1, current() - 1))}> setDraft(String(e.detail.value ?? ''))} onBlur={commit} onConfirm={commit} /> onChange(Math.min(MAX_QTY, current() + 1))}> {unitLabel} ); }