GrRadioGroup
Берут, когда вариантов до семи и все видны.
Обзор
Когда брать
- вариантов до семи и все видны — способ доставки, тип оплаты, роль: выбор без лишнего клика по панели;
- у вариантов есть описание — строка пояснения под подписью, чего не даёт селект;
- группа — часть формы — общее
name,disabledиreadonlyраздаются через контекст; - вариант выглядит кнопкой —
variant="button"без потери семантикиradiogroup.
Когда взять другое
| Нужно | Берите |
|---|---|
| Вариантов больше семи | GrSelect |
| Вариантов 2–5 и они переключают вид, а не значение | GrSegmented |
| Можно выбрать несколько | GrCheckboxGroup |
| Переключатель один и он про «включено/выключено» | GrSwitch |
| Один переключатель вне группы | GrRadio |
Варианты все тона и виды — настоящим компонентом
variant
radioboxbutton
Размеры
xssmmdlg
Состояния
обычнаяdisabledreadonlyinvalid
Матрица живая: наводите и нажимайте. Состояний наведения, фокуса и нажатия здесь нет — они за браузером, а не за пропом.
Playground контролы выводятся из API, а не пишутся руками
Загружается…
0 изменено· состояние — в адресе
<GrRadioGroup :options="options" v-model="value" />Примеры 3 у каждого — живое демо и его код
Чем оплатить счёт
Три способа оплаты сравнивают глазами, поэтому все они на виду — выпадающий список спрятал бы два за кликом. У каждого варианта своё
description, аinvalidотмечает группу, а не вариант: правило нарушает выбор целиком.Pay invoice INV-0418€1,284.50 · due 30 September Visa ending 4242 Charged now · receipt by emailSEPA direct debit AIB ·· 3456 · takes 2 working daysBank transfer Use INV-0418 as the referenceНастройки вида сегментами
variant="button"превращает те же варианты в ряд сегментов: короткие выборы, которые читаются с одного взгляда, — тема, плотность, первый день недели — занимают меньше места и остаются группой переключателей для клавиатуры и скринридера.ThemeSystem follows your computerTable densityCompact fits 40% more rowsWeek starts onCalendars and weekly reportsРасписание дайджеста в одну строку
Четыре коротких ответа помещаются в строку —
orientation="horizontal". Один вариант выключен отдельно: ежедневный дайджест есть в тарифе Team, — и его описание говорит об этом, а не прячет вариант.Revenue digestAn email with revenue, churn and overdue invoices Daily Team planWeekly Mondays, 9:00Monthly On the 1stNever
API порождается из пакета · разойтись не может
Props
| Prop | Type | по умолчанию | Описание |
|---|---|---|---|
disabled | boolean | undefined | false | Выключить всю группу. Складывается с `disabled` у `GrFormField`. |
variant | GrRadioGroupVariant | undefined | "radiobox" | Вид: `radiobox` — кружки с подписями, `button` — ряд склеенных кнопок. По умолчанию `radiobox`. |
options | GrRadioGroupOption[] | undefined | undefined | Варианты, из которых группа строит переключатели. Не нужны, если они разложены в слоте. |
readonly | boolean | undefined | false | Только для чтения: выбор видно, но он не меняется. |
invalid | boolean | undefined | false | Визуальное и ARIA-состояние ошибки. |
required | boolean | undefined | false | Обязательное поле (`aria-required`). |
size | "xs" | "sm" | "md" | "lg" | undefined | undefined | Ступень размера переключателей. По умолчанию `md`; берётся из `GrConfigProvider`. |
ariaLabel | string | undefined | undefined | Доступное имя группы. Не задано — имя берётся из подписи `GrFormField`. |
name | string | undefined | undefined | Имя для нативной формы: выбранное значение уходит скрытым полем. Без имени не уходит. |
orientation | GrRadioGroupOrientation | undefined | "vertical" | Раскладка варианта `radiobox`. Кнопочный вариант всегда горизонтальный — его собирает `GrButtonGroup`. |
modelValueобязательныйv-model | GrRadioValue | — | Выбранное значение (`v-model`): совпадает с `value` одного из переключателей. |
Слоты
| Slot | Type | Описание |
|---|---|---|
default | any | Собственная разметка переключателей вместо генерации из `options`. |
События
| Event | Сигнатура | Описание |
|---|---|---|
update:modelValue | (event: "update:modelValue", value: GrRadioValue): void | — |
change | (event: "change", value: GrRadioValue): void | — |
focus | (event: "focus", event: FocusEvent): void | — |
blur | (event: "blur", event: FocusEvent): void | — |
Методы
| Methods | Сигнатура | Описание |
|---|---|---|
focus | () => void | Поставить фокус на остановку `Tab` группы — обычно выбранный переключатель, а не первый. |
blur | () => void | Снять фокус с остановки `Tab` группы. |
Типы
Все экспортируемые типы подпути, по файлам, где они объявлены. Имена, дженерики и тела читаются из файлов деклараций пакета и разойтись не могут.
import type { GrRadioGroupConfigurableProps, GrRadioGroupVariant, GrRadioGroupOrientation } from '@feugene/granularity/components/GrRadioGroup'Файлdist/types/components/GrRadioGroup/config.d.ts
const grRadioGroupConfig: import("@feugene/granum/contract").GranumComponentDescriptor<"GrRadioGroup">;Файлdist/types/components/GrRadioGroup/defaults.d.ts
Пропы GrRadioGroup, настраиваемые глобально через
<GrConfigProvider :component-defaults="{ GrRadioGroup: { … } }">.
Только оформление — см. GrButton/defaults.ts.
interface GrRadioGroupConfigurableProps {
size: GrButtonSize;
}Файлdist/types/components/GrRadioGroup/GrRadioGroup.vue.d.ts
type GrRadioGroupVariant = 'radiobox' | 'button';type GrRadioGroupOrientation = 'vertical' | 'horizontal';interface GrRadioGroupOption {
value: GrRadioValue;
label: string;
/** Отключить одну опцию, не переходя на слот. */
disabled?: boolean;
/** Пояснение под подписью. Рисуется только в варианте `radiobox`. */
description?: string;
}GrRadioGroup — контейнер группы GrRadio.
Может работать как через слот (ручной рендер GrRadio), так и через проп options.
Предоставляет дочерним GrRadio общий modelValue/disabled/size/name через inject.
interface GrRadioGroupProps {
/** Выбранное значение (`v-model`): совпадает с `value` одного из переключателей. */
modelValue: GrRadioValue;
/** Варианты, из которых группа строит переключатели. Не нужны, если они разложены в слоте. */
options?: GrRadioGroupOption[];
/** Имя для нативной формы: выбранное значение уходит скрытым полем. Без имени не уходит. */
name?: string;
/** Выключить всю группу. Складывается с `disabled` у `GrFormField`. */
disabled?: boolean;
/** Только для чтения: выбор видно, но он не меняется. */
readonly?: boolean;
/** Визуальное и ARIA-состояние ошибки. */
invalid?: boolean;
/** Обязательное поле (`aria-required`). */
required?: boolean;
/**
* Вид: `radiobox` — кружки с подписями, `button` — ряд склеенных кнопок. По умолчанию
* `radiobox`.
*/
variant?: GrRadioGroupVariant;
/**
* Раскладка варианта `radiobox`. Кнопочный вариант всегда горизонтальный —
* его собирает `GrButtonGroup`.
*/
orientation?: GrRadioGroupOrientation;
/** Ступень размера переключателей. По умолчанию `md`; берётся из `GrConfigProvider`. */
size?: GrButtonSize;
/** Доступное имя группы. Не задано — имя берётся из подписи `GrFormField`. */
ariaLabel?: string;
}interface GrRadioGroupEmits {
/** Выбрано новое значение (`v-model`) — кликом или стрелкой: стрелка переносит и выбор. */
(e: 'update:modelValue', value: GrRadioValue): void;
/** Пользователь сменил выбор — тот же payload, что у `update:modelValue`. */
(e: 'change', value: GrRadioValue): void;
/** Фокус вошёл в группу. Переход стрелками между переключателями событием не считается. */
(e: 'focus', event: FocusEvent): void;
/** Фокус ушёл из группы целиком. */
(e: 'blur', event: FocusEvent): void;
}Файлdist/types/components/GrRadioGroup/index.d.ts
type GrRadioGroupInstance = ComponentExposed<typeof GrRadioGroupComponent>;Доступность
Паттерн APG
radio
Клавиши
Enter↑ / ←
| Клавиша | Действие |
|---|---|
| — | Space |
| Enter | выбрать; ↓/→ — следующий |
| ↑ / ← | предыдущий (выбор едет вместе с фокусом, по кругу); Home/End — первый/последний доступный. Группа — одна остановка Tab, отключённые варианты пропускаются |
Полный контракт пакета: docs/keyboard.md ↗
Использование из прозы библиотеки
Два режима
<!-- Пропом: короткий путь для плоского списка. -->
<GrRadioGroup v-model="status" :options="options" />
<!-- Слотом: когда вариантам нужна своя разметка. -->
<GrRadioGroup v-model="status">
<GrRadio value="draft">Черновик</GrRadio>
<GrRadio value="review">На проверке</GrRadio>
</GrRadioGroup>Оба режима получают одну и ту же клавиатуру и один и тот же контекст: состав группы собирается регистрацией детей, а не обходом DOM, поэтому работает и на сервере.
Опции
interface GrRadioGroupOption {
value: string | number | boolean
label: string
disabled?: boolean
description?: string
}disabled отключает один вариант, не переводя всю группу на слот — раньше это
был единственный способ. description рисуется под подписью и только в
варианте radiobox: у кнопочного чипа описанию негде жить.
Раскладка
orientation — vertical (по умолчанию) или horizontal. Кнопочный вариант
всегда горизонтальный: его собирает GrButtonGroup, и orientation там ни на
что не влияет.
Состояния
disabled гасит всю группу, readonly оставляет выбор видимым, но
неизменяемым: aria-readonly объявляет сама группа (у роли radio такого
атрибута нет), а переключатели перестают обещать клик курсором.
invalid и required доходят и до группы, и до вида переключателей. Внутри
GrFormField то же самое приходит из контекста поля: имя через
aria-labelledby, подсказка и текст ошибки — через aria-describedby, ошибка —
через aria-invalid. Группа не labelable-элемент, поэтому <label for> для неё
неприменим.
Клавиатура
Вся раскладка описана в карточке GrRadio: группа — одна остановка Tab,
внутри ↑/↓/←/→ по кругу и Home/End на края. Отключённые варианты
пропускаются везде — и в roving tabindex, и при обходе стрелками.
Пропы этого примера