packages/codemod/docs/SELECT_MIGRATION.md
This document outlines the migration from Chakra UI v2 Select component to v3 NativeSelect.
| v2 Component | v3 Component |
|---|---|
Select | NativeSelect.Root |
NativeSelect.Field | |
NativeSelect.Indicator |
v2:
import { Select } from "@chakra-ui/react"
v3:
import { NativeSelect } from "@chakra-ui/react"
| v2 Prop | v3 Prop | Notes |
|---|---|---|
icon | ❌ | Use NativeSelect.Indicator instead |
v2:
import { Select } from "@chakra-ui/react"
;<Select placeholder="Select option">
<option value="option1">Option 1</option>
<option value="option2">Option 2</option>
<option value="option3">Option 3</option>
</Select>
v3:
import { NativeSelect } from "@chakra-ui/react"
;<NativeSelect.Root>
<NativeSelect.Field placeholder="Select option">
<option value="option1">Option 1</option>
<option value="option2">Option 2</option>
<option value="option3">Option 3</option>
</NativeSelect.Field>
<NativeSelect.Indicator />
</NativeSelect.Root>
v2:
import { Select } from "@chakra-ui/react"
;<Select placeholder="Select option" variant="filled" size="lg">
<option value="1">Option 1</option>
<option value="2">Option 2</option>
</Select>
v3:
import { NativeSelect } from "@chakra-ui/react"
;<NativeSelect.Root>
<NativeSelect.Field placeholder="Select option" variant="filled" size="lg">
<option value="1">Option 1</option>
<option value="2">Option 2</option>
</NativeSelect.Field>
<NativeSelect.Indicator />
</NativeSelect.Root>
v2:
import { Select } from "@chakra-ui/react"
;<Select
placeholder="Select option"
onChange={(e) => console.log(e.target.value)}
>
<option value="1">Option 1</option>
<option value="2">Option 2</option>
</Select>
v3:
import { NativeSelect } from "@chakra-ui/react"
;<NativeSelect.Root>
<NativeSelect.Field
placeholder="Select option"
onChange={(e) => console.log(e.target.value)}
>
<option value="1">Option 1</option>
<option value="2">Option 2</option>
</NativeSelect.Field>
<NativeSelect.Indicator />
</NativeSelect.Root>
v2:
import { Select } from "@chakra-ui/react"
function Demo() {
const [value, setValue] = useState("")
return (
<Select value={value} onChange={(e) => setValue(e.target.value)}>
<option value="1">Option 1</option>
<option value="2">Option 2</option>
</Select>
)
}
v3:
import { NativeSelect } from "@chakra-ui/react"
function Demo() {
const [value, setValue] = useState("")
return (
<NativeSelect.Root>
<NativeSelect.Field
value={value}
onChange={(e) => setValue(e.target.value)}
>
<option value="1">Option 1</option>
<option value="2">Option 2</option>
</NativeSelect.Field>
<NativeSelect.Indicator />
</NativeSelect.Root>
)
}
To automatically migrate your Select components, run:
npx @chakra-ui/codemod transform select <path>
# Transform all files in src directory
npx @chakra-ui/codemod transform select ./src
# Dry run to preview changes
npx @chakra-ui/codemod transform select ./src --dry
If you prefer to migrate manually:
Select import with NativeSelectNativeSelect.RootNativeSelect.FieldNativeSelect.Indicator for dropdown arrowicon prop if present (use indicator styling
instead)Select componentNativeSelect.Root wraps NativeSelect.Field
and NativeSelect.Indicatoricon - Use NativeSelect.Indicator component for custom dropdown arrowsThe v3 NativeSelect provides: