Radix UI предоставляет гибкие и доступные компоненты для создания интерактивных элементов интерфейса. Среди них ключевое место занимают компоненты Control и Label, обеспечивающие корректное взаимодействие с формами и элементами управления.
Компонент Control используется для управления состоянием интерактивных элементов, таких как чекбоксы, радио-кнопки и переключатели. Он не является визуальным элементом сам по себе, а предоставляет логическую оболочку, связывающую состояние элемента с его визуальным представлением.
checked / defaultChecked
– определяет текущее состояние элемента (активен/неактивен).
checked используется для контролируемых компонентов,
defaultChecked – для неконтролируемых.disabled – делает элемент неактивным,
предотвращая любые взаимодействия пользователя.onCheckedChange – коллбэк,
срабатывающий при изменении состояния. Он получает значение
true или false (для чекбоксов) или выбранный
вариант (для радио).import * as Checkbox from '@radix-ui/react-checkbox';
import { CheckIcon } from '@radix-ui/react-icons';
function Example() {
return (
<Checkbox.Root defaultChecked>
<Checkbox.Indicator>
<CheckIcon />
</Checkbox.Indicator>
</Checkbox.Root>
);
}
Пояснение:
Checkbox.Root — это обертка Control.Checkbox.Indicator отображает состояние элемента,
визуализируя его через иконку.Компонент Label отвечает за ассоциирование текста с интерактивным элементом. Он гарантирует корректное взаимодействие с формами и улучшает доступность для пользователей, включая поддержку экранных читалок.
htmlFor.import * as Checkbox from '@radix-ui/react-checkbox';
import { CheckIcon } from '@radix-ui/react-icons';
function LabeledCheckbox() {
return (
<div>
<Checkbox.Root id="accept">
<Checkbox.Indicator>
<CheckIcon />
</Checkbox.Indicator>
</Checkbox.Root>
<Checkbox.Label htmlFor="accept">
Я согласен с условиями
</Checkbox.Label>
</div>
);
}
Пояснение:
id у Control и htmlFor у
Label создают прямую связь, что улучшает
доступность.Radix UI обеспечивает полную синхронизацию между Control и Label. Основные моменты:
:checked, :disabled,
:focus).import * as Checkbox from '@radix-ui/react-checkbox';
import { styled } from '@stitches/react';
const StyledLabel = styled(Checkbox.Label, {
cursor: 'pointer',
color: 'gray',
variants: {
checked: {
true: { color: 'green' },
},
disabled: {
true: { color: 'lightgray', cursor: 'not-allowed' },
},
},
});
function DynamicCheckbox() {
return (
<Checkbox.Root id="subscribe">
<Checkbox.Indicator>✓</Checkbox.Indicator>
<StyledLabel htmlFor="subscribe" checked={true}>
Подписаться на рассылку
</StyledLabel>
</Checkbox.Root>
);
}
Пояснение:
id/htmlFor или через Radix Root–Label
связь.Control и Label в Radix UI формируют фундамент для доступных и управляемых форм. Их правильная комбинация обеспечивает корректное поведение элементов при взаимодействии пользователя и удобную кастомизацию внешнего вида без нарушения логики.