v-checkbox — это компонент пользовательского интерфейса
библиотеки Vuetify, предназначенный для выбора одного или нескольких
значений из набора вариантов. Он реализует стандартный элемент формы
«флажок», однако расширяет его функциональность за счёт интеграции с
системой реактивности Vue, поддержки темизации Material Design и
большого количества дополнительных параметров.
Компонент широко применяется в формах, настройках приложений, фильтрах, списках параметров и в ситуациях, когда пользователь может выбрать несколько независимых вариантов.
Основные характеристики компонента:
v-modelМинимальный пример чекбокса включает только привязку значения через
v-model.
<template>
<v-checkbox
v-model="checked"
label="Согласен с условиями"
></v-checkbox>
</template>
<script>
export default {
data() {
return {
checked: false
}
}
}
</script>
Значение checked принимает булево состояние:
true — чекбокс установленfalse — чекбокс снятПри изменении состояния пользовательского интерфейса значение автоматически обновляется благодаря механизму реактивности Vue.
Текстовая подпись чекбокса задаётся через свойство
label.
<v-checkbox
v-model="notifications"
label="Получать уведомления"
/>
Особенности:
Пример с HTML:
<v-checkbox v-model="accept">
<template v-slot:label>
Я принимаю <a href="#">условия использования</a>
</template>
</v-checkbox>
Чекбоксы часто используются для выбора нескольких элементов из
списка. В этом случае v-model связывается с массивом.
<template>
<div>
<v-checkbox
v-model="selected"
label="JavaScript"
value="js"
/>
<v-checkbox
v-model="selected"
label="Python"
value="python"
/>
<v-checkbox
v-model="selected"
label="Go"
value="go"
/>
</div>
</template>
<script>
export default {
data() {
return {
selected: []
}
}
}
</script>
Механизм работы:
Пример состояния массива:
selected = ["js", "python"]
По умолчанию чекбокс возвращает true или
false. Однако можно задать собственные значения.
<v-checkbox
v-model="status"
label="Активен"
true-value="enabled"
false-value="disabled"
/>
Теперь состояние будет выглядеть так:
status = "enabled"
или
status = "disabled"
Это удобно при работе с API или при хранении данных в базе.
Свойство disabled блокирует возможность изменения
состояния чекбокса.
<v-checkbox
v-model="active"
label="Активная опция"
disabled
/>
Особенности:
В отличие от disabled, readonly запрещает
изменение состояния, но сохраняет обычный визуальный стиль.
<v-checkbox
v-model="value"
label="Только чтение"
readonly
/>
Отличия:
| Свойство | Возможность изменения | Внешний вид |
|---|---|---|
| disabled | запрещено | приглушённый |
| readonly | запрещено | обычный |
v-checkbox поддерживает промежуточное состояние —
indeterminate. Оно используется, когда невозможно
однозначно определить выбор.
Типичный пример — чекбокс «Выбрать всё» в списке.
<v-checkbox
v-model="all"
:indeterminate="isIndeterminate"
label="Выбрать все"
/>
Это состояние:
Пример вычисления состояния:
computed: {
isIndeterminate() {
return this.selected.length > 0 &&
this.selected.length < this.items.length
}
}
Vuetify поддерживает систему тем Material Design, позволяющую задавать цвет элементов.
<v-checkbox
v-model="value"
label="Основной цвет"
color="primary"
/>
Примеры цветов:
primarysecondarysuccesserrorwarninginfoМожно использовать и пользовательские цвета:
<v-checkbox
v-model="value"
color="purple"
/>
Свойство dense уменьшает вертикальные отступы
компонента.
<v-checkbox
v-model="value"
label="Компактный вариант"
dense
/>
Используется:
По умолчанию чекбокс находится слева, а текст справа. Однако можно изменить расположение.
<v-checkbox
v-model="value"
label="Текст слева"
reverse
/>
Свойство reverse меняет порядок элементов:
Текст [checkbox]
v-checkbox часто используется внутри компонента
v-form.
<v-form ref="form">
<v-checkbox
v-model="agreement"
label="Я принимаю условия"
:rules="[v => !!v || 'Необходимо согласие']"
/>
</v-form>
Если чекбокс не установлен, правило валидации возвращает сообщение об ошибке.
Свойство rules принимает массив функций проверки.
<v-checkbox
v-model="terms"
label="Принять условия"
:rules="rules"
/>
data() {
return {
rules: [
v => !!v || 'Необходимо подтвердить'
]
}
}
Правила выполняются:
form.validate()Для сложных подписей используется слот label.
<v-checkbox v-model="accept">
<template v-slot:label>
Я согласен с
<strong>политикой конфиденциальности</strong>
</template>
</v-checkbox>
Преимущества:
Несколько чекбоксов удобно объединять в логические группы.
<div>
<h3>Навыки</h3>
<v-checkbox
v-model="skills"
label="JavaScript"
value="js"
/>
<v-checkbox
v-model="skills"
label="Vue"
value="vue"
/>
<v-checkbox
v-model="skills"
label="Node.js"
value="node"
/>
</div>
Результат:
skills = ["js", "vue"]
Чекбоксы часто создаются динамически с помощью
v-for.
<v-checkbox
v-for="item in items"
:key="item.id"
v-model="selected"
:label="item.name"
:value="item.id"
/>
Пример данных:
items: [
{ id: 1, name: "Фильмы" },
{ id: 2, name: "Музыка" },
{ id: 3, name: "Книги" }
]
После выбора:
selected = [1, 3]
Основные события:
Вызывается при изменении значения.
<v-checkbox
v-model="value"
@input="onChange"
/>
Срабатывает после изменения состояния.
<v-checkbox
v-model="value"
@change="onChanged"
/>
Иногда требуется работать не со строками, а с объектами.
<v-checkbox
v-model="selected"
:value="item"
:label="item.name"
/>
В этом случае массив содержит сами объекты:
selected = [
{ id: 1, name: "JavaScript" }
]
При работе с десятками и сотнями чекбоксов рекомендуется:
v-for с уникальным keyБольшое количество реактивных чекбоксов может создавать значительную нагрузку на систему реактивности Vue.
| Свойство | Назначение |
|---|---|
v-model |
двусторонняя привязка |
label |
текст подписи |
value |
значение чекбокса |
color |
цвет |
disabled |
блокировка |
readonly |
режим чтения |
dense |
компактный режим |
indeterminate |
промежуточное состояние |
rules |
правила валидации |
true-value |
значение при установке |
false-value |
значение при снятии |
Наиболее распространённые области применения
v-checkbox:
Формы регистрации
Фильтрация данных
Настройки приложения
Множественный выбор
Благодаря гибкой системе параметров и полной интеграции с Vue
компонент v-checkbox позволяет реализовывать сложные
пользовательские интерфейсы без создания собственных элементов
управления.