string
Radio
Radios are used when only one choice may be selected in a series of options.
Native HTML radios are 100% accessible by default, so we used a very common CSS technique to style the radio.
Import#
import { Radio, RadioGroup } from '@chakra-ui/react'
Usage#
function RadioExample() {const [value, setValue] = React.useState('1')return (<RadioGroup onChange={setValue} value={value}><Stack direction='row'><Radio value='1'>First</Radio><Radio value='2'>Second</Radio><Radio value='3'>Third</Radio></Stack></RadioGroup>)}
Radio with custom color#
You can override the colorScheme
of the Radio to any color key specified in
theme.colors
.
<RadioGroup defaultValue='2'><Stack spacing={5} direction='row'><Radio colorScheme='red' value='1'>Radio</Radio><Radio colorScheme='green' value='2'>Radio</Radio></Stack></RadioGroup>
Radio sizes#
The checkbox comes with 3 sizes.
<Stack><Radio size='sm' name='1' colorScheme='red'>Radio</Radio><Radio size='md' name='1' colorScheme='green'>Radio</Radio><Radio size='lg' name='1' colorScheme='orange' defaultChecked>Radio</Radio></Stack>
Disabled radios#
<RadioGroup defaultValue='1'><Stack><Radio value='1' isDisabled>Checked</Radio><Radio value='2'>Unchecked</Radio><Radio value='3'>Unchecked</Radio></Stack></RadioGroup>
Horizontal alignment#
<RadioGroup defaultValue='1'><Stack spacing={4} direction='row'><Radio value='1' isDisabled>Radio 1</Radio><Radio value='2'>Radio 2</Radio><Radio value='3'>Radio 3</Radio></Stack></RadioGroup>
Invalid Radio#
<Radio isInvalid>Radio</Radio>
Custom Radio Buttons#
In some cases, you might need to create components that work like radios but
don't look like radios. Chakra exports useRadio
, and useRadioGroup
hooks to
help with this scenario. Here's what you need to do:
- Create a component that consumes the
useRadio
hook. - Use the
useRadioGroup
hook to control a group of custom radios.
// 1. Create a component that consumes the `useRadio` hookfunction RadioCard(props) {const { getInputProps, getCheckboxProps } = useRadio(props)const input = getInputProps()const checkbox = getCheckboxProps()return (<Box as='label'><input {...input} /><Box{...checkbox}cursor='pointer'borderWidth='1px'borderRadius='md'boxShadow='md'_checked={{bg: 'teal.600',color: 'white',borderColor: 'teal.600',}}_focus={{boxShadow: 'outline',}}px={5}py={3}>{props.children}</Box></Box>)}// Step 2: Use the `useRadioGroup` hook to control a group of custom radios.function Example() {const options = ['react', 'vue', 'svelte']const { getRootProps, getRadioProps } = useRadioGroup({name: 'framework',defaultValue: 'react',onChange: console.log,})const group = getRootProps()return (<HStack {...group}>{options.map((value) => {const radio = getRadioProps({ value })return (<RadioCard key={value} {...radio}>{value}</RadioCard>)})}</HStack>)}render(<Example />)
Note about name
prop#
We recommend passing the name
prop to the RadioGroup
component, instead of
passing it to each Radio
component. By default, the name
prop of the
RadioGroup takes precedence.
// Do this ✅<RadioGroup name="form-name"><Radio>Radio 1</Radio><Radio>Radio 2</Radio></RadioGroup>// Don't do this ❌<RadioGroup ><Radio name="form-name">Radio 1</Radio><Radio name="form-name">Radio 2</Radio></RadioGroup>
Props#
colorScheme
colorScheme
"blue"
data-radiogroup
data-radiogroup
@internal
any
defaultChecked
defaultChecked
If true
, the radio will be initially checked.
boolean
defaultIsChecked
defaultIsChecked
If true
, the radio will be initially checked.
@deprecated Please use defaultChecked
which mirrors the default prop
name for radio elements.
boolean
id
id
id assigned to input
string
isChecked
isChecked
If true
, the radio will be checked.
You'll need to pass onChange
to update its value (since it is now controlled)
boolean
isDisabled
isDisabled
If true
, the radio will be disabled
boolean
isFocusable
isFocusable
If true
and isDisabled
is true, the radio will remain
focusable but not interactive.
boolean
isFullWidth
isFullWidth
If true
, the radio will occupy the full width of its parent container
@deprecated This component defaults to 100% width,
please use the props maxWidth
or width
to configure
boolean
isInvalid
isInvalid
If true
, the radio button will be invalid. This also sets `aria-invalid` to true
.
boolean
isReadOnly
isReadOnly
If true
, the radio will be read-only
boolean
isRequired
isRequired
If true
, the radio button will be required. This also sets `aria-required` to true
.
boolean
name
name
The name of the input field in a radio (Useful for form submission).
string
onChange
onChange
Function called when checked state of the input
changes
((event: ChangeEvent<HTMLInputElement>) => void)
size
size
string
"md"
spacing
spacing
The spacing between the checkbox and its label text
SystemProps["marginLeft"]
0.5rem
value
value
The value to be used in the radio button. This is the value that will be returned on form submission.
string | number
variant
variant
string