Skip to contents

Radio

An easily stylable radio button component.

View as Markdown
Best apple

Usage guidelines

  • Form controls must have an accessible name: It can be created using <label> elements, or the Field and Fieldset components. See Labeling a radio group and the forms guide.

Anatomy

Radio is always placed within Radio Group. Import the components and place them together:

Anatomy

Examples

Labeling a radio group

Label the group with aria-labelledby and a sibling label element:

Using aria-labelledby to label a radio group

An enclosing <label> is the simplest labeling pattern for each radio:

Using an enclosing label to label a radio button

Rendering as a native button

By default, <Radio.Root> renders a <span> element to support enclosing labels. Prefer rendering each radio as a native button when using sibling labels (htmlFor/id).

Sibling label pattern with a native button

Native buttons with wrapping labels are supported by using the render callback to avoid invalid HTML, so the hidden input is placed outside the label:

Render callback

Form integration

Use Field and Fieldset for group labeling and form integration:

Using Radio Group in a form

API reference

RadioGroup

Provides a shared state to a series of radio buttons. Renders a <div> element.

namestring
Name
Description

Identifies the field when a form is submitted.

Type
defaultValueValue
Description

The uncontrolled value of the radio button that should be initially selected.

To render a controlled radio group, use the value prop instead.

Type
valueValue
Name
Description

The controlled value of the radio item that should be currently selected.

To render an uncontrolled radio group, use the defaultValue prop instead.

Type
onValueChangefunction
Description

Callback fired when the value changes.

Type
formstring
Name
Description

Identifies the form that owns the radio inputs. Useful when the radio group is rendered outside the form.

Type
disabledbooleanfalse
Description

Whether the component should ignore user interaction.

Type
Default
false
readOnlybooleanfalse
Description

Whether the user should be unable to select a different radio button in the group.

Type
Default
false
requiredbooleanfalse
Description

Whether the user must choose a value before submitting a form.

Type
Default
false
inputRefReact.Ref<HTMLInputElement>
Description

A ref to access the hidden input element.

Type
classNamestring | function
Description

CSS class applied to the element, or a function that returns a class based on the component’s state.

Type
styleReact.CSSProperties | function
Name
Type
renderReactElement | function
Name
Description

Allows you to replace the component’s HTML element with a different tag, or compose it with another component.

Accepts a ReactElement or a function that returns the element to render.

Type
data-disabled

Present when the radio group is disabled.

AttributeDescription
data-disabled

Present when the radio group is disabled.

RadioGroup.PropsHide

Re-Export of RadioGroup props as RadioGroupProps

RadioGroup.StateHide

RadioGroup.ChangeEventReasonHide

RadioGroup.ChangeEventDetailsHide

Root

Represents the radio button itself. Renders a <span> element and a hidden <input> beside.

value*
Name
Description

The unique identifying value of the radio in a group.

Type
nativeButtonbooleanfalse
Description

Whether the component renders a native <button> element when replacing it via the render prop. Set to true if the rendered element is a native button.

Type
Default
false
disabledboolean
Description

Whether the component should ignore user interaction.

Type
readOnlyboolean
Description

Whether the user should be unable to select the radio button.

Type
requiredboolean
Description

Whether the user must choose a value before submitting a form.

Type
inputRefReact.Ref<HTMLInputElement>
Description

A ref to access the hidden input element.

Type
classNamestring | function
Description

CSS class applied to the element, or a function that returns a class based on the component’s state.

Type
styleReact.CSSProperties | function
Name
Type
renderReactElement | function
Name
Description

Allows you to replace the component’s HTML element with a different tag, or compose it with another component.

Accepts a ReactElement or a function that returns the element to render.

Type
data-checked

Present when the radio is checked.

data-unchecked

Present when the radio is not checked.

data-disabled

Present when the radio is disabled.

data-readonly

Present when the radio is readonly.

data-required

Present when the radio is required.

data-valid

Present when the radio is in valid state (when wrapped in Field.Root).

data-invalid

Present when the radio is in invalid state (when wrapped in Field.Root).

data-dirty

Present when the radio’s value has changed (when wrapped in Field.Root).

data-touched

Present when the radio has been touched (when wrapped in Field.Root).

data-filled

Present when the radio is checked (when wrapped in Field.Root).

data-focused

Present when the radio is focused (when wrapped in Field.Root).

AttributeDescription
data-checked

Present when the radio is checked.

data-unchecked

Present when the radio is not checked.

data-disabled

Present when the radio is disabled.

data-readonly

Present when the radio is readonly.

data-required

Present when the radio is required.

data-valid

Present when the radio is in valid state (when wrapped in Field.Root).

data-invalid

Present when the radio is in invalid state (when wrapped in Field.Root).

data-dirty

Present when the radio’s value has changed (when wrapped in Field.Root).

data-touched

Present when the radio has been touched (when wrapped in Field.Root).

data-filled

Present when the radio is checked (when wrapped in Field.Root).

data-focused

Present when the radio is focused (when wrapped in Field.Root).

Radio.Root.PropsHide

Re-Export of Root props as RadioRootProps

Radio.Root.StateHide

Indicator

Indicates whether the radio button is selected. Renders a <span> element.

classNamestring | function
Description

CSS class applied to the element, or a function that returns a class based on the component’s state.

Type
styleReact.CSSProperties | function
Name
Type
keepMountedbooleanfalse
Description

Whether to keep the HTML element in the DOM when the radio button is inactive.

Type
Default
false
renderReactElement | function
Name
Description

Allows you to replace the component’s HTML element with a different tag, or compose it with another component.

Accepts a ReactElement or a function that returns the element to render.

Type
data-checked

Present when the radio is checked.

data-unchecked

Present when the radio is not checked.

data-disabled

Present when the radio is disabled.

data-readonly

Present when the radio is readonly.

data-required

Present when the radio is required.

data-valid

Present when the radio is in valid state (when wrapped in Field.Root).

data-invalid

Present when the radio is in invalid state (when wrapped in Field.Root).

data-dirty

Present when the radio’s value has changed (when wrapped in Field.Root).

data-touched

Present when the radio has been touched (when wrapped in Field.Root).

data-filled

Present when the radio is checked (when wrapped in Field.Root).

data-focused

Present when the radio is focused (when wrapped in Field.Root).

data-starting-style

Present when the radio indicator is animating in.

data-ending-style

Present when the radio indicator is animating out.

AttributeDescription
data-checked

Present when the radio is checked.

data-unchecked

Present when the radio is not checked.

data-disabled

Present when the radio is disabled.

data-readonly

Present when the radio is readonly.

data-required

Present when the radio is required.

data-valid

Present when the radio is in valid state (when wrapped in Field.Root).

data-invalid

Present when the radio is in invalid state (when wrapped in Field.Root).

data-dirty

Present when the radio’s value has changed (when wrapped in Field.Root).

data-touched

Present when the radio has been touched (when wrapped in Field.Root).

data-filled

Present when the radio is checked (when wrapped in Field.Root).

data-focused

Present when the radio is focused (when wrapped in Field.Root).

data-starting-style

Present when the radio indicator is animating in.

data-ending-style

Present when the radio indicator is animating out.

Radio.Indicator.PropsHide

Re-Export of Indicator props as RadioIndicatorProps

Radio.Indicator.StateHide