useSwitch — это хук из библиотеки React
Aria, предназначенный для создания доступных переключателей
(switch, аналог toggle), соответствующих стандартам ARIA и
поддерживающих правильную работу с клавиатурой, экранными читалками и
другими ассистивными технологиями.
Хук не рендерит UI, а предоставляет необходимые пропсы и состояния, которые затем можно применить к любому компоненту переключателя.
import {useSwitch} from '@react-aria/switch';
import {useToggleState} from '@react-stately/toggle';
import {useRef} from 'react';
function SwitchExample() {
const state = useToggleState({});
const ref = useRef();
const {inputProps} = useSwitch({isSelected: state.isSelected, onChange: state.toggle}, ref);
return (
<label>
<input {...inputProps} ref={ref} />
Включено
</label>
);
}
useToggleState из React Stately
используется для управления состоянием переключателя.inputProps содержит все атрибуты и обработчики
событий, необходимые для корректной работы переключателя.ref требуется для привязки к DOM-элементу
<input>.useSwitchХук принимает объект с ключевыми параметрами:
isSelected — булево значение, определяющее состояние
переключателя.defaultSelected — начальное значение при создании
состояния.onChange — функция обратного вызова при изменении
состояния.isDisabled — блокировка переключателя.children — содержимое метки переключателя (label).Пример:
const {inputProps} = useSwitch({
isSelected: true,
onChange: () => console.log('Переключатель изменён'),
isDisabled: false
}, ref);
Хук возвращает объект с основными пропсами:
inputProps — пропсы для
<input type="checkbox"> или
<input type="switch">.isSelected (опционально) — текущее состояние, если
требуется внешняя проверка.isDisabled — состояние доступности, может
использоваться для кастомной стилизации.Применение inputProps гарантирует:
role="switch",
aria-checked.useSwitch позволяет использовать любой элемент
для визуализации переключателя, не ограничиваясь стандартным
<input>:
function CustomSwitch() {
const state = useToggleState({});
const ref = useRef();
const {inputProps} = useSwitch({isSelected: state.isSelected, onChange: state.toggle}, ref);
return (
<div
role="switch"
aria-checked={state.isSelected}
tabIndex={0}
onCl ick={state.toggle}
onKeyD own={(e) => e.key === 'Enter' && state.toggle()}
ref={ref}
style={{
width: '50px',
height: '25px',
background: state.isSelected ? 'green' : 'gray',
borderRadius: '15px',
cursor: 'pointer',
position: 'relative'
}}
>
<div style={{
width: '23px',
height: '23px',
background: 'white',
borderRadius: '50%',
position: 'absolute',
top: '1px',
left: state.isSelected ? '26px' : '1px',
transition: 'left 0.2s'
}} />
</div>
);
}
Ключевые моменты:
role="switch" и aria-checked нужны для
доступности.onClick и onKeyDown
обеспечивает интерактивность.useToggleState или через isSelected/onChange
из родительского компонента.useSwitch автоматически добавляет обработку клавиатуры
для <input>:
tabIndex и
ref.Для кастомного UI необходимо явно обрабатывать клавиши:
<div
role="switch"
aria-checked={state.isSelected}
tabIndex={0}
onKeyD own={(e) => {
if (e.key === 'Enter' || e.key === ' ') {
e.preventDefault();
state.toggle();
}
}}
>
label) или
используйте aria-label/aria-labelledby.role="switch" и
aria-checked.tabIndex — элемент должен быть доступен
через клавиатуру.onKeyDown для поддержки пробела и
Enter.inputProps поддерживает стандартные атрибуты формы:
<input {...inputProps} name="newsletter" value="subscribe" />
name и value позволяют включить
переключатель в <form> и отправлять данные на
сервер.isSelected и onChange
совместимо с библиотеками управления формами.useSwitch обеспечивает полную
ARIA-доступность, позволяет использовать кастомные элементы и
легко интегрируется с состоянием через useToggleState или
внешние пропсы. Это делает его идеальным инструментом для создания
профессиональных переключателей в React-приложениях.