useToggleState — это хук из библиотеки React
Aria, предназначенный для управления состоянием компонентов
типа переключатель (toggle), таких как чекбоксы, кнопки-переключатели и
другие элементы с бинарным состоянием. Он обеспечивает удобный и
унифицированный способ работы с состоянием включено/выключено и
автоматически поддерживает доступность (accessibility) через
ARIA-атрибуты.
import { useToggleState } from '@react-stately/toggle';
Хук следует использовать в функциональных компонентах, где требуется отслеживание состояния переключателя.
const toggle = useToggleState({ defaultSelected: false });
Параметры:
true или false). По умолчанию
false.Возвращаемый объект содержит ключевые свойства и методы:
true/false).Пример использования:
function ToggleExample() {
const toggle = useToggleState({ defaultSelected: false });
return (
<button onCl ick={toggle.toggle}>
{toggle.isSelected ? 'Включено' : 'Выключено'}
</button>
);
}
useToggleState поддерживает оба подхода:
Неконтролируемый компонент — состояние управляется хукoм самостоятельно:
const toggle = useToggleState({ defaultSelected: true });
Контролируемый компонент — состояние управляется
извне через isSelected и onChange:
function ControlledToggle({ selected, onChange }) {
const toggle = useToggleState({ isSelected: selected });
return (
<button
aria-pressed={toggle.isSelected}
onCl ick={() => onChange(!toggle.isSelected)}
>
{toggle.isSelected ? 'Включено' : 'Выключено'}
</button>
);
}
В этом случае useToggleState используется как
вспомогательный объект для удобного доступа к методам
toggle() и setSelected().
React Aria автоматизирует работу с ARIA-атрибутами. Для
переключателей важно использовать aria-pressed или
aria-checked в зависимости от типа компонента.
Пример для кнопки-переключателя:
function AccessibleToggle() {
const toggle = useToggleState({ defaultSelected: false });
return (
<button
role="switch"
aria-checked={toggle.isSelected}
onCl ick={toggle.toggle}
>
{toggle.isSelected ? 'Активен' : 'Неактивен'}
</button>
);
}
Здесь role="switch" указывает экранным ридерам, что
кнопка ведет себя как переключатель, а aria-checked
синхронизируется с состоянием.
useToggleState хорошо сочетается с хуками из
React Aria:
Пример с useButton:
import { useButton } from '@react-aria/button';
function SwitchButton() {
const toggle = useToggleState({ defaultSelected: false });
const ref = React.useRef();
const { buttonProps } = useButton({ onPress: toggle.toggle }, ref);
return (
<button {...buttonProps} ref={ref} aria-pressed={toggle.isSelected}>
{toggle.isSelected ? 'Вкл' : 'Выкл'}
</button>
);
}
Использование useButton обеспечивает корректную
обработку клавиатурных событий (Enter, Space)
и фокусировки.
reset()
возвращает переключатель в исходное состояние.setSelected(value) и toggle() позволяют
изменять состояние извне.Пример с группой:
const toggles = [
useToggleState({ defaultSelected: false }),
useToggleState({ defaultSelected: true }),
];
return (
<>
{toggles.map((t, index) => (
<button key={index} onCl ick={t.toggle}>
{t.isSelected ? 'Вкл' : 'Выкл'}
</button>
))}
</>
);
useToggleState для компонентов с бинарным
состоянием.useButton, useCheckbox или
useSwitch для полноценной поддержки доступности.isSelected для
корректного отображения в assistive technologies.useToggleState является фундаментальным инструментом в
React Aria, обеспечивающим простое, безопасное и
доступное управление состоянием переключателей. Его интеграция с другими
хуками библиотеки позволяет создавать полностью управляемые и доступные
интерфейсы без лишнего кода.