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