Состояние checked применяется к интерактивным элементам
управления, отражающим выбор пользователя. В пользовательских
интерфейсах это состояние используется для элементов, которые могут
находиться в одном из нескольких вариантов: выбран, не выбран, а иногда
— частично выбран.
В библиотеке Radix UI управление состоянием
checked реализовано через набор примитивов, которые
обеспечивают:
Наиболее активно состояние checked применяется в
следующих компонентах Radix UI:
Каждый из этих компонентов реализует схожую модель состояния, но с разными правилами поведения.
В Radix UI состояние выбора может быть представлено тремя значениями:
true
false
"indeterminate"
Значения интерпретируются следующим образом:
| Значение | Смысл |
|---|---|
true |
элемент выбран |
false |
элемент не выбран |
"indeterminate" |
промежуточное состояние |
Промежуточное состояние используется преимущественно в Checkbox, когда родительский элемент отражает частичный выбор дочерних элементов.
Radix UI автоматически синхронизирует это состояние с ARIA-атрибутами:
aria-checked="true"
aria-checked="false"
aria-checked="mixed"
Это обеспечивает корректную работу со скринридерами.
Все компоненты Radix UI, поддерживающие checked, могут
работать в двух режимах:
Состояние хранится внутри компонента.
import * as Checkbox from "@radix-ui/react-checkbox";
<Checkbox.Root defaultChecked />
defaultChecked устанавливает начальное состояние, после
чего компонент самостоятельно управляет изменениями.
Особенности:
useStateСостояние хранится во внешнем состоянии приложения.
const [checked, setChecked] = useState(false);
<Checkbox.Root
checked={checked}
onCheckedCha nge={setChecked}
/>
Особенности контролируемого режима:
Checkbox — основной элемент управления состоянием
checked.
Минимальная структура компонента:
import * as Checkbox from "@radix-ui/react-checkbox";
<Checkbox.Root>
<Checkbox.Indicator />
</Checkbox.Root>
Checkbox.Root отвечает за:
Поддерживаемые свойства:
| Свойство | Назначение |
|---|---|
checked |
контролируемое состояние |
defaultChecked |
начальное состояние |
onCheckedChange |
обработчик изменения |
disabled |
отключение элемента |
required |
обязательный ввод |
Checkbox.Indicator отображает визуальное состояние
чекбокса.
<Checkbox.Root>
<Checkbox.Indicator>
✓
</Checkbox.Indicator>
</Checkbox.Root>
Indicator появляется только тогда, когда состояние
checked = true.
Radix UI предоставляет единый обработчик:
onCheckedChange
Пример:
const handleChange = (value) => {
console.log(value);
};
Использование:
<Checkbox.Root onCheckedCha nge={handleChange} />
Аргумент может принимать значения:
true
false
"indeterminate"
Это отличает Radix UI от стандартного HTML-чекбокса, где состояние бинарное.
Промежуточное состояние применяется в сложных интерфейсах выбора.
Пример:
const [checked, setChecked] = useState("indeterminate");
<Checkbox.Root
checked={checked}
onCheckedCha nge={setChecked}
/>
Визуально это состояние обычно отображается горизонтальной линией вместо галочки.
Рассмотрим структуру:
Все файлы
├ Документ 1
├ Документ 2
└ Документ 3
Логика состояния:
| Состояние дочерних | Родитель |
|---|---|
| все выбраны | checked |
| ни один не выбран | unchecked |
| частично выбраны | indeterminate |
Radix UI позволяет явно установить:
checked="indeterminate"
Radix UI автоматически добавляет data-атрибуты, которые удобно использовать для стилизации.
data-state="checked"
data-state="unchecked"
data-state="indeterminate"
Пример CSS:
[data-state="checked"] {
background: black;
}
[data-state="indeterminate"] {
background: gray;
}
Это позволяет строить стили без JavaScript.
Radix UI поддерживает отправку значений формы.
Для этого используется свойство:
name
Пример:
<Checkbox.Root name="terms" value="accepted">
<Checkbox.Indicator />
</Checkbox.Root>
При отправке формы браузер отправит:
terms=accepted
если чекбокс выбран.
Switch — это альтернативная визуализация состояния
checked, представляющая собой переключатель.
Структура:
import * as Switch from "@radix-ui/react-switch";
<Switch.Root>
<Switch.Thumb />
</Switch.Root>
Switch использует те же свойства:
checked
defaultChecked
onCheckedChange
Пример:
const [enabled, setEnabled] = useState(false);
<Switch.Root
checked={enabled}
onCheckedCha nge={setEnabled}
>
<Switch.Thumb />
</Switch.Root>
В RadioGroup состояние checked реализуется
иначе.
Выбран может быть только один элемент.
Структура:
import * as RadioGroup from "@radix-ui/react-radio-group";
<RadioGroup.Root>
<RadioGroup.Item value="a" />
<RadioGroup.Item value="b" />
</RadioGroup.Root>
const [value, setValue] = useState("a");
<RadioGroup.Root
value={value}
onValueCha nge={setValue}
>
Каждый элемент автоматически получает состояние:
data-state="checked"
или
data-state="unchecked"
Компонент Toggle концептуально похож на
Checkbox, но использует состояние:
pressed
Тем не менее логика полностью соответствует checked.
Пример:
import * as Toggle from "@radix-ui/react-toggle";
<Toggle.Root>
Bold
</Toggle.Root>
Контролируемый режим:
const [pressed, setPressed] = useState(false);
<Toggle.Root
pressed={pressed}
onPressedCha nge={setPressed}
/>
ToggleGroup позволяет создавать группы
переключателей.
Режимы:
<ToggleGroup.Root type="single">
<ToggleGroup.Item value="left" />
<ToggleGroup.Item value="center" />
<ToggleGroup.Item value="right" />
</ToggleGroup.Root>
Здесь активен только один элемент.
<ToggleGroup.Root type="multiple">
<ToggleGroup.Item value="bold" />
<ToggleGroup.Item value="italic" />
</ToggleGroup.Root>
Здесь несколько элементов могут быть выбраны одновременно.
Radix UI реализует полную поддержку клавиатуры.
Основные клавиши:
| Клавиша | Действие |
|---|---|
| Space | переключить checked |
| Enter | активировать элемент |
| Tab | переход между элементами |
| Arrow Keys | навигация в RadioGroup |
ARIA-атрибуты добавляются автоматически:
role="checkbox"
role="switch"
role="radio"
Под капотом Radix UI использует утилиту:
useControllableState
Она обеспечивает единый API для:
checkeddefaultCheckedonCheckedChangeАлгоритм работы:
checked.defaultChecked.Псевдокод:
const [value, setValue] = useControllableState({
prop: checked,
defaultProp: defaultChecked,
onChange: onCheckedChange
});
Radix UI не содержит встроенных стилей.
Для оформления используется CSS.
Пример:
.CheckboxRoot {
width: 20px;
height: 20px;
border: 1px solid black;
}
.CheckboxRoot[data-state="checked"] {
background: black;
}
.CheckboxRoot[data-state="indeterminate"] {
background: gray;
}
Поскольку data-state меняется автоматически, можно легко
добавить анимацию.
.CheckboxIndicator {
transition: transform 150ms ease;
}
[data-state="checked"] .CheckboxIndicator {
transform: scale(1);
}
[data-state="unchecked"] .CheckboxIndicator {
transform: scale(0);
}
Контролируемая модель позволяет интегрировать checked с
любыми стейт-менеджерами.
Пример с Zustand:
const useStore = create((set) => ({
checked: false,
setChecked: (value) => set({ checked: value })
}));
Использование:
const { checked, setChecked } = useStore();
<Checkbox.Root
checked={checked}
onCheckedCha nge={setChecked}
/>
Пример управления несколькими элементами:
const [items, setItems] = useState({
a: false,
b: false,
c: false
});
Изменение:
const toggle = (key) => {
setItems({
...items,
[key]: !items[key]
});
};
Использование:
<Checkbox.Root
checked={items.a}
onCheckedCha nge={() => toggle("a")}
/>
Тип значения checked в Radix UI:
type CheckedState = boolean | "indeterminate";
Использование:
const [checked, setChecked] = useState<CheckedState>(false);
Обработчик:
const handleChange = (value: CheckedState) => {
setChecked(value);
};
Radix UI оптимизирован для минимальных перерисовок:
useControllableStatecheckedЭто позволяет безопасно использовать сотни элементов в больших списках.
checked без onCheckedChange<Checkbox.Root checked={true} />
Компонент станет read-only.
Нельзя одновременно использовать:
checked
defaultChecked
setChecked(!checked)
Это работает только для boolean.
Правильный вариант:
setChecked(checked === true ? false : true)
Состояние checked является фундаментальной частью
системы примитивов Radix UI.
Оно обеспечивает:
За счёт унифицированной модели состояния библиотека позволяет строить сложные системы управления выбором без необходимости писать собственную логику синхронизации состояния.