apps/docs/content/docs/en/react/migration/(components)/numberinput.mdx
In v2, NumberInput was a single component with props:
import { NumberInput } from "@heroui/react";
export default function App() {
return <NumberInput label="Amount" defaultValue={1024} />;
}
In v3, NumberField requires compound components:
import { NumberField, Label } from "@heroui/react";
export default function App() {
return (
<NumberField defaultValue={1024}>
<Label>Amount</Label>
<NumberField.Group>
<NumberField.DecrementButton />
<NumberField.Input />
<NumberField.IncrementButton />
</NumberField.Group>
</NumberField>
);
}
v2: NumberInput
v3: NumberField
v2: Single component with props
v3: Compound components: NumberField.Group, NumberField.Input, NumberField.IncrementButton, NumberField.DecrementButton
| v2 Prop | v3 Location | Notes |
|---|---|---|
onValueChange | onChange | Renamed event handler |
label | — | Use Label component |
description | — | Use Description component |
errorMessage | — | Use FieldError component |
variant | variant (on NumberField) | Simplified to primary | secondary only |
color | — | Removed (use Tailwind CSS) |
size | — | Removed (use Tailwind CSS) |
radius | — | Removed (use Tailwind CSS) |
startContent | — | Place content manually in Group |
endContent | — | Place content manually in Group |
labelPlacement | — | Handle with layout classes |
hideStepper | — | Omit NumberField.IncrementButton and NumberField.DecrementButton |
isClearable | — | Handle clear functionality manually |
classNames | — | Use className props on individual components |
isWheelDisabled | — | Removed |
<Tabs items={["v2", "v3"]}>
<Tab value="v2">
tsx <NumberInput description="Enter the amount" label="Amount" /> <NumberInput errorMessage="Please enter a valid number" isInvalid label="Amount" /> <NumberInput isRequired label="Quantity" />
</Tab>
<Tab value="v3">
tsx import { Description, FieldError, Label } from "@heroui/react"; <NumberField> <Label>Amount</Label> <NumberField.Group> <NumberField.DecrementButton /> <NumberField.Input /> <NumberField.IncrementButton /> </NumberField.Group> <Description>Enter the amount</Description> </NumberField> <NumberField isInvalid> <Label>Amount</Label> <NumberField.Group> <NumberField.DecrementButton /> <NumberField.Input /> <NumberField.IncrementButton /> </NumberField.Group> <FieldError>Please enter a valid number</FieldError> </NumberField> <NumberField isRequired> <Label>Quantity</Label> <NumberField.Group> <NumberField.DecrementButton /> <NumberField.Input /> <NumberField.IncrementButton /> </NumberField.Group> </NumberField>
</Tab>
</Tabs>
<Tabs items={["v2", "v3"]}> <Tab value="v2"> ```tsx import { useState } from "react";
const [value, setValue] = useState();
<NumberInput
value={value}
onValueChange={setValue}
/>
```
const [value, setValue] = useState<number | undefined>();
<NumberField value={value} onChange={setValue}>
<Label>Amount</Label>
<NumberField.Group>
<NumberField.DecrementButton />
<NumberField.Input />
<NumberField.IncrementButton />
</NumberField.Group>
</NumberField>
```
<Tabs items={["v2", "v3"]}>
<Tab value="v2">
tsx <NumberInput hideStepper label="Amount" />
</Tab>
<Tab value="v3">
tsx <NumberField> <Label>Amount</Label> <NumberField.Group> <NumberField.Input /> </NumberField.Group> </NumberField>
</Tab>
</Tabs>
<Tabs items={["v2", "v3"]}>
<Tab value="v2">
tsx <NumberInput label="Quantity" maxValue={100} minValue={0} /> <NumberInput label="Percentage" step={0.1} /> <NumberInput formatOptions={{style: "currency", currency: "USD"}} label="Price" />
</Tab>
<Tab value="v3">
tsx <NumberField maxValue={100} minValue={0}> <Label>Quantity</Label> <NumberField.Group> <NumberField.DecrementButton /> <NumberField.Input /> <NumberField.IncrementButton /> </NumberField.Group> </NumberField> <NumberField step={0.1}> <Label>Percentage</Label> <NumberField.Group> <NumberField.DecrementButton /> <NumberField.Input /> <NumberField.IncrementButton /> </NumberField.Group> </NumberField> <NumberField formatOptions={{style: "currency", currency: "USD"}}> <Label>Price</Label> <NumberField.Group> <NumberField.DecrementButton /> <NumberField.Input /> <NumberField.IncrementButton /> </NumberField.Group> </NumberField>
</Tab>
</Tabs>
The v3 NumberField follows this structure:
NumberField (Root)
├── Label (optional)
├── NumberField.Group
│ ├── NumberField.DecrementButton
│ ├── NumberField.Input
│ └── NumberField.IncrementButton
├── Description (optional)
└── FieldError (optional)
NumberInput → NumberFieldNumberField.Group, NumberField.Input, etc.)Label, Description, FieldError)NumberField.IncrementButton and NumberField.DecrementButtononValueChange → onChangevariant="primary" and variant="secondary"; color, size, radius removed — use Tailwind CSSstartContent, endContent - place manuallyisClearable removed - handle manuallyhideStepper removed - omit buttons insteadlabelPlacement removed - handle with layout