QBtnToggle — это компонент библиотеки Quasar,
предназначенный для выбора одного значения из набора вариантов с помощью
кнопок. Визуально он представляет собой группу кнопок, где активной
может быть только одна. Используется как более наглядная и компактная
альтернатива выпадающим спискам (QSelect) или радиокнопкам
(QRadio).
Компонент особенно полезен в интерфейсах, где важна скорость выбора и визуальная доступность всех опций одновременно.
Минимальный пример включает привязку значения через
v-model и передачу массива опций:
<template>
<q-btn-toggle
v-model="model"
:options="options"
/>
</template>
<script setup>
import { ref } from 'vue'
const model = ref('one')
const options = [
{ label: 'Один', value: 'one' },
{ label: 'Два', value: 'two' },
{ label: 'Три', value: 'three' }
]
</script>
Ключевые моменты:
v-model хранит текущее выбранное значениеoptions — массив объектов с параметрами кнопокКаждый элемент массива options может содержать следующие
поля:
| Поле | Описание |
|---|---|
label |
Текст кнопки |
value |
Значение |
icon |
Иконка |
color |
Цвет кнопки |
disable |
Отключение кнопки |
Пример:
const options = [
{ label: 'Список', value: 'list', icon: 'list' },
{ label: 'Сетка', value: 'grid', icon: 'grid_view' },
{ label: 'Карта', value: 'map', icon: 'map', disable: true }
]
По умолчанию одна кнопка всегда активна. Чтобы разрешить сброс
выбора, используется свойство clearable:
<q-btn-toggle
v-model="model"
:options="options"
clearable
/>
Теперь повторный клик по активной кнопке снимает выбор.
<q-btn-toggle
v-model="model"
:options="options"
color="primary"
text-color="white"
toggle-color="secondary"
/>
color — цвет неактивных кнопокtoggle-color — цвет активной кнопкиtext-color — цвет текста<q-btn-toggle flat />
<q-btn-toggle outline />
<q-btn-toggle unelevated />
flat — без фонаoutline — только границыunelevated — без тени<q-btn-toggle
rounded
dense
/>
rounded — скругленные кнопкиdense — уменьшенные отступыПо умолчанию кнопки располагаются горизонтально. Для вертикального режима:
<q-btn-toggle
v-model="model"
:options="options"
vertical
/>
<q-btn-toggle size="sm" />
<q-btn-toggle size="md" />
<q-btn-toggle size="lg" />
Размер влияет на:
Кнопки могут содержать только иконки:
const options = [
{ value: 'left', icon: 'arrow_left' },
{ value: 'right', icon: 'arrow_right' }
]
Комбинация текста и иконки:
{ label: 'Назад', value: 'back', icon: 'arrow_back' }
Изменение значения отслеживается стандартным способом:
<q-btn-toggle
v-model="model"
:options="options"
/>
<div>{{ model }}</div>
Также можно использовать событие
@update:model-value:
<q-btn-toggle
v-model="model"
:options="options"
@update:model-value="onChange"
/>
function onChange(val) {
console.log('Новое значение:', val)
}
Массив кнопок может формироваться динамически:
const modes = ['day', 'week', 'month']
const options = modes.map(mode => ({
label: mode.toUpperCase(),
value: mode
}))
<q-btn-toggle
v-model="model"
:options="options"
disable
/>
Отключает всю группу кнопок.
const options = [
{ label: 'A', value: 'a' },
{ label: 'B', value: 'b', disable: true }
]
QBtnToggle интегрируется с QForm:
<q-form @submit="onSubmit">
<q-btn-toggle
v-model="model"
:options="options"
/>
<q-btn type="submit" label="Отправить" />
</q-form>
Компонент поддерживает кастомизацию содержимого кнопок через слот
default:
<q-btn-toggle v-model="model" :options="options">
<template #default="scope">
<q-btn
:label="scope.opt.label"
:icon="scope.opt.icon"
:color="scope.selected ? 'primary' : 'grey'"
@click="scope.toggle()"
/>
</template>
</q-btn-toggle>
scope содержит:
opt — текущая опцияselected — активна ли кнопкаtoggle() — функция переключения| Компонент | Когда использовать |
|---|---|
QBtnToggle |
Быстрый выбор, визуальные переключатели |
QSelect |
Большое количество опций |
QRadio |
Формы с классическим интерфейсом |
<q-btn-toggle
v-model="view"
:options="[
{ value: 'list', icon: 'list' },
{ value: 'grid', icon: 'grid_view' }
]"
/>
<q-btn-toggle
v-model="status"
:options="[
{ label: 'Все', value: 'all' },
{ label: 'Активные', value: 'active' },
{ label: 'Завершённые', value: 'done' }
]"
/>
<q-btn-toggle
v-model="theme"
:options="[
{ label: 'Светлая', value: 'light' },
{ label: 'Тёмная', value: 'dark' }
]"
/>
Для ограничения допустимых значений используется логика на уровне
v-model:
watch(model, (val) => {
if (!allowedValues.includes(val)) {
model.value = 'default'
}
})
Компонент легковесен, но при большом количестве кнопок:
Рекомендуется:
QSelectoptionsimport { ref } from 'vue'
export function useToggle(defaultValue) {
const value = ref(defaultValue)
const set = (val) => {
value.value = val
}
return {
value,
set
}
}
Использование:
<q-btn-toggle v-model="value" :options="options" />
const mode = ref('list')
const isGrid = computed(() => mode.value === 'grid')
const store = useAppStore()
<q-btn-toggle
v-model="store.viewMode"
:options="options"
/>
dense в компактных интерфейсахQTooltip) при неочевидных
значенияхЧасто используется совместно с:
QToolbar — переключатели в панели инструментовQCard — управление содержимым карточекQTable — переключение режимов отображенияQLayout — изменение глобальных состояний
интерфейса<template>
<div>
<q-btn-toggle
v-model="view"
:options="viewOptions"
toggle-color="primary"
unelevated
/>
<div v-if="view === 'list'">Список</div>
<div v-else-if="view === 'grid'">Сетка</div>
</div>
</template>
<script setup>
import { ref } from 'vue'
const view = ref('list')
const viewOptions = [
{ value: 'list', icon: 'list' },
{ value: 'grid', icon: 'grid_view' }
]
</script>