Radix UI предоставляет мощные и настраиваемые примитивы для построения интерфейсов, среди которых Select, DropdownMenu, RadioGroup и другие элементы, обеспечивающие работу с выбором. Работа с выбором в Radix UI строится на управлении состоянием, синхронизации значений и обработке событий, что позволяет создавать полностью контролируемые или неконтролируемые компоненты.
В основе управления выбором лежат три ключевых аспекта:
Radix UI строит компоненты так, чтобы они были контролируемыми и неконтролируемыми одновременно, что позволяет гибко использовать их как в простых, так и в сложных интерфейсах.
Компонент Select используется для создания выпадающих
списков с возможностью выбора одного элемента. Структура типичного
Select включает:
import * as Sel ect from '@radix-ui/react-select';
<Sel ect.Root value={selectedValue} onValueCha nge={setSelectedValue}>
<Sel ect.Trigger>
<Select.Value placeholder="Выберите опцию" />
<Select.Icon />
</Select.Trigger>
<Select.Content>
<Select.ScrollUpButton />
<Select.Viewport>
<Select.Item value="option1">
<Select.ItemText>Опция 1</Select.ItemText>
<Select.ItemIndicator />
</Select.Item>
<Select.Item value="option2">
<Select.ItemText>Опция 2</Select.ItemText>
<Select.ItemIndicator />
</Select.Item>
</Select.Viewport>
<Select.ScrollDownButton />
</Select.Content>
</Select.Root>
Select.Root – корневой элемент,
который управляет состоянием выбора.value и onValueChange –
позволяют контролировать выбранное значение.Select.Trigger – кнопка, открывающая
выпадающий список.Select.Item – отдельные опции с
атрибутом value.Select.ItemIndicator – визуальная
индикация текущего выбора.Обработка выбора реализуется через
onValueChange, который вызывается при выборе элемента. Это
позволяет обновлять состояние React или синхронизировать данные с
формой.
RadioGroup обеспечивает выбор одной опции среди
нескольких:
import * as RadioGroup fr om '@radix-ui/react-radio-group';
<RadioGroup.Root value={selectedRadio} onValueCha nge={setSelectedRadio}>
<RadioGroup.Item value="optionA">
<RadioGroup.Indicator />
</RadioGroup.Item>
<RadioGroup.Item value="optionB">
<RadioGroup.Indicator />
</RadioGroup.Item>
</RadioGroup.Root>
RadioGroup.Root – контейнер группы
радиокнопок.RadioGroup.Item – отдельная кнопка с
уникальным значением.RadioGroup.Indicator – отображение
активного выбора.Состояние value полностью контролирует выбранный
элемент, а onValueChange позволяет реагировать на изменение
выбора.
Для меню с более сложной структурой используется
DropdownMenu. Обработка выбора осуществляется через события
onSelect у элементов меню:
import * as DropdownMenu fr om '@radix-ui/react-dropdown-menu';
<DropdownMenu.Root>
<DropdownMenu.Trigger>Меню</DropdownMenu.Trigger>
<DropdownMenu.Content>
<DropdownMenu.Item onSel ect={() => console.log('Опция 1 выбрана')}>
Опция 1
</DropdownMenu.Item>
<DropdownMenu.Item onSel ect={() => console.log('Опция 2 выбрана')}>
Опция 2
</DropdownMenu.Item>
</DropdownMenu.Content>
</DropdownMenu.Root>
onSelect срабатывает при выборе
элемента, что позволяет запускать любые пользовательские действия.DropdownMenu.Item может содержать вложенные подменю,
что расширяет возможности по обработке выбора в сложных
интерфейсах.Для компонентов с множественным выбором, таких как
Checkbox или кастомные списки, Radix UI поддерживает
контроль массива значений:
import * as Checkbox fr om '@radix-ui/react-checkbox';
const [checkedItems, setCheckedItems] = React.useState([]);
<Checkbox.Root
checked={checkedItems.includes('item1')}
onCheckedCha nge={(state) => handleCheckboxChange('item1', state)}
>
<Checkbox.Indicator />
</Checkbox.Root>
Метод handleCheckboxChange обычно реализуется так, чтобы
добавлять или удалять значение из массива выбранных элементов, что
обеспечивает гибкость и точный контроль состояния.
Radix UI компоненты легко интегрируются с библиотеками форм, такими
как react-hook-form. Для этого состояние выбора связывается
с полями формы:
<Select.Root
value={formValues.select}
onValueCha nge={(value) => setFormValue('select', value)}
>
<Select.Trigger>
<Select.Value />
</Select.Trigger>
<Select.Content>
<Select.Item value="a">A</Select.Item>
<Select.Item value="b">B</Select.Item>
</Select.Content>
</Select.Root>
Событие onValueChange обеспечивает синхронизацию с
объектом формы, что позволяет валидировать данные и управлять отправкой
формы без дополнительных оберток.
value и
onValueChange.onSelect, onCheckedChange и
аналогичные предоставляют гибкий механизм реакции на действия
пользователя.Обработка выбора в Radix UI строится на четкой архитектуре состояния, которая позволяет создавать высоконастраиваемые и доступные интерфейсы без потери контроля над данными.