Radix UI предоставляет компоненты управления состоянием
выбора, среди которых особое место занимают
RadioGroup и CheckboxGroup. Их поведение
зависит от режима выбора: single (одиночный) и
multiple (множественный). Понимание различий между
этими режимами критически важно для построения корректного
пользовательского интерфейса и управления состоянием.
Single режим применяется, когда требуется выбрать
только один элемент из группы. В Radix UI чаще всего это реализуется
через компонент RadioGroup с дочерними элементами
RadioItem.
Пример структуры:
import * as RadioGroup from '@radix-ui/react-radio-group';
<RadioGroup.Root defaultValue="apple" aria-label="Выберите фрукт">
<RadioGroup.Item value="apple">Яблоко</RadioGroup.Item>
<RadioGroup.Item value="orange">Апельсин</RadioGroup.Item>
<RadioGroup.Item value="banana">Банан</RadioGroup.Item>
</RadioGroup.Root>
Ключевые особенности single режима:
aria-checked, role="radio" и
role="radiogroup" обеспечивают доступность для экранных
читалок.<RadioGroup.Root
defaultValue="apple"
onValueCha nge={(value) => console.log("Выбран:", value)}
>
...
</RadioGroup.Root>
С помощью defaultValue можно задать начальное
выбранное значение, а value — управлять состоянием
контролируемого компонента.
Multiple режим реализуется через компонент
CheckboxGroup или с помощью отдельных Checkbox
компонентов. Он используется, когда требуется разрешить
несколько выборов одновременно.
Пример структуры:
import * as Checkbox from '@radix-ui/react-checkbox';
<Checkbox.Root defaultChecked>
<Checkbox.Indicator />
Согласен с условиями
</Checkbox.Root>
<Checkbox.Root>
<Checkbox.Indicator />
Подписка на новости
</Checkbox.Root>
Ключевые особенности multiple режима:
true/false или
"indeterminate").Пример контролируемого multiple режима:
const [selected, setSelected] = React.useState([]);
<Checkbox.Root
checked={selected.includes('terms')}
onCheckedCha nge={(checked) => {
setSelected((prev) =>
checked ? [...prev, 'terms'] : prev.filter(v => v !== 'terms')
);
}}
>
<Checkbox.Indicator />
Согласен с условиями
</Checkbox.Root>
| Характеристика | Single | Multiple |
|---|---|---|
| Количество выбранных | 1 элемент | Несколько элементов |
| Компоненты | RadioGroup + RadioItem |
Checkbox или CheckboxGroup |
| Событие изменения | onValueChange |
onCheckedChange |
| Контролируемое состояние | value |
Массив значений / checked |
| aria-роль | radiogroup, radio |
group, checkbox |
Single режим удобно использовать с
управляемым состоянием через useState:
const [fruit, setFruit] = React.useState('apple');
<RadioGroup.Root value={fruit} onValueCha nge={setFruit}>
<RadioGroup.Item value="apple">Яблоко</RadioGroup.Item>
<RadioGroup.Item value="orange">Апельсин</RadioGroup.Item>
</RadioGroup.Root>
Multiple режим требует массивного состояния, чтобы хранить все выбранные элементы:
const [selectedOptions, setSelectedOptions] = React.useState([]);
const toggleOption = (option) => {
setSelectedOptions((prev) =>
prev.includes(option)
? prev.filter(v => v !== option)
: [...prev, option]
);
};
Single режим можно легко интегрировать с
react-hook-form или Formik через
value и onValueChange. Multiple
режим требует, чтобы массив выбранных значений
синхронизировался с состоянием формы.
<Checkbox.Root
checked={form.values.tags.includes('news')}
onCheckedCha nge={(checked) => {
const updated = checked
? [...form.values.tags, 'news']
: form.values.tags.filter(t => t !== 'news');
form.setFieldValue('tags', updated);
}}
>
<Checkbox.Indicator />
Новости
</Checkbox.Root>
Оба режима Radix UI легко комбинируются с современными React-хуками, что позволяет строить сложные, но управляемые интерфейсы с минимальными усилиями.