Switch

Switches allow users to turn an individual option on or off. They are usually used to activate or deactivate a specific setting.

installyarn add @react-spectrum/switch
version3.0.0-rc.2
usageimport {Switch} from '@react-spectrum/switch'

Example#


<Switch>Low power mode</Switch>
<Switch>Low power mode</Switch>
<Switch>
  Low power mode
</Switch>

Content#


Switches accept children, which are rendered as the label.

Switches are best used for communicating activation (e.g. on/off states), while checkboxes are best used for communicating selection (e.g. multiple table rows). Switches, unlike checkboxes, can't have an error state.

Accessibility#

In certain cases a visible label isn't needed. For example, a Switch located at the top of a panel which toggles the panels options on or off. If a visible label isn't specified, an aria-label must be provided to the Switch for accessibility. If the field is labeled by a separate element, an aria-labelledby prop must be provided using the id of the labeling element instead.

<Switch aria-label="Low power mode" />
<Switch aria-label="Low power mode" />
<Switch aria-label="Low power mode" />

Internationalization#

To internationalize a Switch, a localized label should be passed to the children or aria-label prop. For languages that are read right-to-left (e.g. Hebrew and Arabic), the layout of the switch is automatically flipped.

Value#


Switches are not selected by default. The defaultSelected prop can be used to set the default state (uncontrolled). Alternatively, the isSelected prop can be used to make the selected state controlled.

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

  return (
    <>
      <Switch
        defaultSelected>
        Low power mode (uncontrolled)
      </Switch>

      <Switch
        isSelected={selected}
        onChange={setSelection}>
        Low power mode (controlled)
      </Switch>
    </>
  )
}
function Example() {
  let [selected, setSelection] = React.useState(false);

  return (
    <>
      <Switch
        defaultSelected>
        Low power mode (uncontrolled)
      </Switch>

      <Switch
        isSelected={selected}
        onChange={setSelection}>
        Low power mode (controlled)
      </Switch>
    </>
  )
}
function Example() {
  let [
    selected,
    setSelection
  ] = React.useState(
    false
  );

  return (
    <>
      <Switch
        defaultSelected>
        Low power mode
        (uncontrolled)
      </Switch>

      <Switch
        isSelected={
          selected
        }
        onChange={
          setSelection
        }>
        Low power mode
        (controlled)
      </Switch>
    </>
  );
}

Events#


Switches accept a user defined onChange prop, triggered whenever the Switch is pressed. The example below uses onChange to alert the user to changes in state.

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

  return (
    <>
      <Switch onChange={setSelection}>
        Switch Label
      </Switch>
      <div>The Switch is on: {selected.toString()}</div>
    </>
  );
 }
function Example() {
  let [selected, setSelection] = React.useState(false);

  return (
    <>
      <Switch onChange={setSelection}>
        Switch Label
      </Switch>
      <div>The Switch is on: {selected.toString()}</div>
    </>
  );
 }
function Example() {
  let [
    selected,
    setSelection
  ] = React.useState(
    false
  );

  return (
    <>
      <Switch
        onChange={
          setSelection
        }>
        Switch Label
      </Switch>
      <div>
        The Switch is on:{' '}
        {selected.toString()}
      </div>
    </>
  );
}

Props#


NameTypeDefaultDescription
isEmphasizedbooleanThis prop sets the emphasized style which provides visual prominence.
childrenReactNode
defaultSelectedboolean
isSelectedboolean
valuestring
namestring
isDisabledbooleanWhether the input is disabled.
isRequiredbooleanWhether user input is required on the input before form submission. Often paired with the necessityIndicator prop to add a visual indicator to the input.
validationStateValidationStateWhether 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
UNSAFE_classNamestring
UNSAFE_styleCSSProperties
Events
NameTypeDefaultDescription
onChange( (isSelected: boolean )) => void
onFocus( (e: FocusEvent )) => voidHandler that is called when the element receives focus.
onBlur( (e: FocusEvent )) => 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: KeyboardEvent )) => voidHandler that is called when a key is pressed.
onKeyUp( (e: KeyboardEvent )) => 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
Spacing
NameTypeDefaultDescription
marginDimensionValue
marginTopDimensionValue
marginLeftDimensionValue
marginRightDimensionValue
marginBottomDimensionValue
marginStartDimensionValue
marginEndDimensionValue
marginXDimensionValue
marginYDimensionValue
Sizing
NameTypeDefaultDescription
widthDimensionValue
minWidthDimensionValue
maxWidthDimensionValue
heightDimensionValue
minHeightDimensionValue
maxHeightDimensionValue
Positioning
NameTypeDefaultDescription
position'static' | 'relative' | 'absolute' | 'fixed' | 'sticky'
topDimensionValue
bottomDimensionValue
leftDimensionValue
rightDimensionValue
startDimensionValue
endDimensionValue
zIndexnumber
isHiddenboolean
Accessibility
NameTypeDefaultDescription
idstring
tabIndexnumber
aria-controlsstringIdentifies the element (or elements) whose contents or presence are controlled by the current element.
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-detailsstringIdentifies the element (or elements) that provide a detailed, extended description for the object.
aria-errormessagestringIdentifies the element that provides an error message for the object.

Visual options#


Disabled#

View guidelines

<Switch isDisabled>Switch Label</Switch>
<Switch isDisabled>Switch Label</Switch>
<Switch isDisabled>
  Switch Label
</Switch>

Emphasized#

View guidelines

<Switch isEmphasized defaultSelected>Switch Label</Switch>
<Switch isEmphasized defaultSelected>Switch Label</Switch>
<Switch
  isEmphasized
  defaultSelected>
  Switch Label
</Switch>

Read only#

<Switch isReadOnly isSelected>Switch Label</Switch>
<Switch isReadOnly isSelected>Switch Label</Switch>
<Switch
  isReadOnly
  isSelected>
  Switch Label
</Switch>