RadioGroup

Radio buttons allow users to select a single option from a list of mutually exclusive options. All possible options are exposed up front for users to compare.

installyarn add @react-spectrum/radio
version3.0.0-rc.1
usageimport {Radio,RadioGroup} from '@react-spectrum/radio'

Example#


<RadioGroup label="Favorite pet">
 <Radio value="dogs">Dogs</Radio>
 <Radio value="cats">Cats</Radio>
</RadioGroup>
Favorite pet

Content#


RadioGroup accepts multiple Radio elements as children. Each Radio represents an option that can be selected, labeled by its children.

Note: A Radio must be contained within a RadioGroup. If for whatever reason you need to have a single radio by itself, wrap it in a RadioGroup.

Value#


RadioGroup only allows single selection. An initial, uncontrolled value can be provided to the RadioGroup using the defaultValue prop. Alternatively, a controlled value can be provided using the value prop.

Accessibility#

For accessibility, all Radio elements within a RadioGroup automatically receive an aria-checked attribute reflecting their individual selection status.

<RadioGroup label="Uncontrolled" defaultValue="dragon">
 <Radio value="wizard">Wizard</Radio>
 <Radio value="dragon">Dragon</Radio>
</RadioGroup>

<RadioGroup label="Controlled" value="dragon">
 <Radio value="wizard">Wizard</Radio>
 <Radio value="dragon">Dragon</Radio>
</RadioGroup>
Uncontrolled
Controlled

Labeling#


When a visible label isn't being used an aria-label prop is needed to explicitly set the label for the RadioGroup. Radio elements should always have a visible label.

<RadioGroup aria-label="Favorite Avatar">
 <Radio value="wizard">Wizard</Radio>
 <Radio value="dragon">Dragon</Radio>
</RadioGroup>

Internationalization#

To internationalize a RadioGroup, a localized string should be set as the child content of the Radio. For languages that are read right to left (e.g. Hebrew and Arabic), the Radio is placed on the right side of the text.

Events#


RadioGroup accepts an onChange prop, which is triggered when a user changes the selected value. The example below uses onChange to log how the user is interacting with the component.

function Example() {
  let [selected, setSelection] = React.useState('select me');

  return (
    <div>
      <div>You have selected: {selected}</div>
      <RadioGroup aria-label="Favorite Avatar" onChange={value => setSelection(value)}>
       <Radio value="wizard">
         Wizard
       </Radio>
       <Radio value="dragon">
         Dragon
       </Radio>
      </RadioGroup>
    </div>
  );
}
You have selected: select me

Validation#


RadioGroups can display a validation state to communicate to the user if the current value is invalid. Implement your own validation logic in your app and pass "invalid" to the RadioGroup via the validationState prop.

<RadioGroup label="Example Options" validationState="invalid">
 <Radio value="wizard">Wizard</Radio>
 <Radio value="dragon">Dragon</Radio>
</RadioGroup>
Example Options

RadioGroup Props#


NameTypeDefaultDescription
orientation'vertical'The axis the Radio Button(s) should align with.
isEmphasizedboolean

By default, radio buttons are not emphasized (gray). The emphasized (blue) version provides visual prominence.

childrenReactElement<>
namestring
valuestringThe current value (controlled).
defaultValuestringThe default value (uncontrolled).
isDisabledbooleanWhether the input is disabled.
isRequiredboolean

Whether user input is required on the input before form submission. Often paired with the necessityIndicator prop to add a visual indicator to the input.

validationState"valid"Whether the input should display its "valid" or "invalid" visual styling.
isReadOnlybooleanWhether the input can be selected but not changed by the user.
autoFocusbooleanWhether the element should receive focus on render
labelReactNodeThe content to display as the label.
labelPosition"top"The label's overall position relative to the element it is labeling.
labelAlign"start"The label's horizontal alignment relative to the element it is labeling.
necessityIndicator"icon"Whether the required state should be shown as an icon or text.
UNSAFE_classNamestring
UNSAFE_styleCSSProperties
Events
NameTypeDefaultDescription
onChange(value: string) => voidHandler that is called when the value changes.
onFocus(e: ) => voidHandler that is called when the element receives focus.
onBlur(e: ) => voidHandler that is called when the element loses focus.
onFocusChange(isFocused: boolean) => voidHandler that is called when the element's focus status changes.
onKeyDown(e: ) => voidHandler that is called when a key is pressed.
onKeyUp(e: ) => voidHandler that is called when a key is released.
Layout
NameTypeDefaultDescription
flexstringnumberboolean
flexGrownumber
flexShrinknumber
flexBasisnumberstring
alignSelf'auto' | 'normal' | 'start' | 'end' | 'flex-start' | 'flex-end' | 'self-start' | 'self-end' | 'center' | 'stretch'
justifySelf'auto' | 'normal' | 'start' | 'end' | 'flex-start' | 'flex-end' | 'self-start' | 'self-end' | 'center' | 'left' | 'right' | 'stretch'
flexOrdernumber
gridAreastring
gridColumnstring
gridRowstring
gridColumnStartstring
gridColumnEndstring
gridRowStartstring
gridRowEndstring
slotstring
Spacing
NameTypeDefaultDescription
margin
marginTop
marginLeft
marginRight
marginBottom
marginStart
marginEnd
marginX
marginY
Sizing
NameTypeDefaultDescription
width
minWidth
maxWidth
height
minHeight
maxHeight
Positioning
NameTypeDefaultDescription
position'static' | 'relative' | 'absolute' | 'fixed' | 'sticky'
top
bottom
left
right
start
end
zIndexnumber
isHiddenboolean
Accessibility
NameTypeDefaultDescription
rolestring
idstring
tabIndexnumber
aria-labelstringDefines a string value that labels the current element.
aria-labelledbystringIdentifies the element (or elements) that labels the current element.
aria-describedbystringIdentifies the element (or elements) that describes the object.
aria-controlsstringIdentifies the element (or elements) whose contents or presence are controlled by the current element.
aria-ownsstring

Identifies an element (or elements) in order to define a visual, functional, or contextual parent/child relationship between DOM elements where the DOM hierarchy cannot be used to represent the relationship.

aria-hiddenboolean'false''true'Indicates that the element is perceivable but disabled, so it is not editable or otherwise operable.

Radio Props#


NameTypeDefaultDescription
valuestring
childrenReactNodeThe label for the Radio. Accepts any renderable node.
isDisabledboolean

Whether the radio button is disabled or not. Shows that a selection exists, but is not available in that circumstance.

autoFocusbooleanWhether the element should receive focus on render
UNSAFE_classNamestring
UNSAFE_styleCSSProperties
Events
NameTypeDefaultDescription
onFocus(e: ) => voidHandler that is called when the element receives focus.
onBlur(e: ) => voidHandler that is called when the element loses focus.
onFocusChange(isFocused: boolean) => voidHandler that is called when the element's focus status changes.
onKeyDown(e: ) => voidHandler that is called when a key is pressed.
onKeyUp(e: ) => voidHandler that is called when a key is released.
Layout
NameTypeDefaultDescription
flexstringnumberboolean
flexGrownumber
flexShrinknumber
flexBasisnumberstring
alignSelf'auto' | 'normal' | 'start' | 'end' | 'flex-start' | 'flex-end' | 'self-start' | 'self-end' | 'center' | 'stretch'
justifySelf'auto' | 'normal' | 'start' | 'end' | 'flex-start' | 'flex-end' | 'self-start' | 'self-end' | 'center' | 'left' | 'right' | 'stretch'
flexOrdernumber
gridAreastring
gridColumnstring
gridRowstring
gridColumnStartstring
gridColumnEndstring
gridRowStartstring
gridRowEndstring
slotstring
Spacing
NameTypeDefaultDescription
margin
marginTop
marginLeft
marginRight
marginBottom
marginStart
marginEnd
marginX
marginY
Sizing
NameTypeDefaultDescription
width
minWidth
maxWidth
height
minHeight
maxHeight
Positioning
NameTypeDefaultDescription
position'static' | 'relative' | 'absolute' | 'fixed' | 'sticky'
top
bottom
left
right
start
end
zIndexnumber
isHiddenboolean
Accessibility
NameTypeDefaultDescription
rolestring
idstring
tabIndexnumber
aria-labelstringDefines a string value that labels the current element.
aria-labelledbystringIdentifies the element (or elements) that labels the current element.
aria-describedbystringIdentifies the element (or elements) that describes the object.
aria-controlsstringIdentifies the element (or elements) whose contents or presence are controlled by the current element.
aria-ownsstring

Identifies an element (or elements) in order to define a visual, functional, or contextual parent/child relationship between DOM elements where the DOM hierarchy cannot be used to represent the relationship.

aria-hiddenboolean'false''true'Indicates that the element is perceivable but disabled, so it is not editable or otherwise operable.

Visual Options#


Orientation#

A RadioGroup is vertically aligned by default. An optional prop can be passed to the RadioGroup to position the Radio elements inline.

<RadioGroup label="Example Options" orientation="horizontal">
 <Radio value="wizard">Wizard</Radio>
 <Radio value="dragon">Dragon</Radio>
</RadioGroup>
Example Options

Label Position#

The default position of a label is on top of the RadioGroup. An optional prop can be passed to the RadioGroup that will position the label at the start of the topmost Radio.

<RadioGroup label="Example Options" labelPosition="side">
 <Radio value="wizard">Wizard</Radio>
 <Radio value="dragon">Dragon</Radio>
</RadioGroup>
Example Options

Label Align#

Labels can be aligned to the "start" or the "end" of the RadioGroup. For left-to-right (LTR) languages, "start" refers to the left most edge of the RadioGroup and "end" refers to the right most edge. For right-to-left (RTL) languages, this is flipped.

<RadioGroup label="Example Options" labelAlign="end">
 <Radio value="wizard">Wizard</Radio>
 <Radio value="dragon">Dragon</Radio>
</RadioGroup>
Example Options

Disabled#

View Guidelines

<RadioGroup label="Example Options" isDisabled>
 <Radio value="wizard">Wizard</Radio>
 <Radio value="dragon">Dragon</Radio>
</RadioGroup>
Example Options
<RadioGroup label="Example Options">
 <Radio value="wizard">Wizard</Radio>
 <Radio value="dragon" isDisabled>Dragon</Radio>
</RadioGroup>
Example Options

Read Only#

The isReadOnly prop makes the selection immutable. Unlike isDisabled, the RadioGroup remains focusable. See the MDN docs for more information.

<RadioGroup label="Example Options" defaultValue="wizard" isReadOnly>
 <Radio value="wizard">Wizard</Radio>
 <Radio value="dragon">Dragon</Radio>
</RadioGroup>
Example Options

Emphasized#

View Guidelines

<RadioGroup label="Example Options" isEmphasized>
 <Radio value="wizard">Wizard</Radio>
 <Radio value="dragon">Dragon</Radio>
</RadioGroup>
Example Options