Компонент v-text-field — один из базовых элементов ввода
данных в библиотеке Vuetify. Он используется для получения текстовой
информации от пользователя: строк, чисел, email-адресов, паролей и
других типов данных. Компонент построен поверх стандартного
HTML-элемента <input>, но дополняется мощной системой
стилизации, валидации, реактивности и взаимодействия с другими
элементами интерфейса.
v-text-field входит в систему компонентов форм Vuetify и
тесно интегрирован с такими компонентами, как:
v-formv-textareav-selectv-autocompleteБлагодаря этому создаётся единая экосистема элементов ввода с единым поведением, стилями и логикой валидации.
Самый простой вариант использования v-text-field —
создание поля для ввода текста.
<template>
<v-text-field label="Имя"></v-text-field>
</template>
Компонент автоматически создаёт:
label)v-modelНаиболее распространённый способ работы с v-text-field —
двусторонняя привязка данных через v-model.
Это позволяет автоматически синхронизировать значение поля с переменной состояния Vue.
<template>
<v-text-field
v-model="username"
label="Имя пользователя"
></v-text-field>
</template>
<script>
export default {
data() {
return {
username: ''
}
}
}
</script>
В данном случае:
usernamelabelОпределяет текст подписи поля.
<v-text-field label="Email"></v-text-field>
Label автоматически:
placeholderОтображает текст-подсказку внутри поля.
<v-text-field
label="Телефон"
placeholder="+7 (___) ___-__-__"
></v-text-field>
placeholder исчезает при вводе текста.
hintПозволяет добавить поясняющий текст под полем.
<v-text-field
label="Пароль"
hint="Минимум 8 символов"
></v-text-field>
По умолчанию hint отображается только при фокусе.
Для постоянного отображения используется
persistent-hint.
<v-text-field
label="Пароль"
hint="Минимум 8 символов"
persistent-hint
></v-text-field>
typeОпределяет тип HTML-ввода.
<v-text-field
label="Email"
type="email"
></v-text-field>
Поддерживаемые типы:
textpasswordemailnumbertelurlsearchПример поля для пароля:
<v-text-field
label="Пароль"
type="password"
></v-text-field>
v-text-field поддерживает встроенную систему правил
(rules).
Правила представляют собой массив функций, возвращающих:
true — если значение корректноПример:
<v-text-field
v-model="email"
label="Email"
:rules="emailRules"
></v-text-field>
data() {
return {
email: '',
emailRules: [
v => !!v || 'Поле обязательно',
v => /.+@.+\..+/.test(v) || 'Неверный email'
]
}
}
Возможности системы правил:
Для обозначения обязательного поля обычно используется правило:
v => !!v || 'Поле обязательно'
Пример:
<v-text-field
label="Имя"
v-model="name"
:rules="[v => !!v || 'Введите имя']"
></v-text-field>
Если правило возвращает строку, компонент автоматически:
v-form)Пример визуального поведения:
v-form)v-text-field часто используется внутри
v-form.
<v-form ref="form">
<v-text-field
v-model="email"
label="Email"
:rules="emailRules"
></v-text-field>
</v-form>
Проверка всей формы:
this.$refs.form.validate()
Методы формы:
| Метод | Назначение |
|---|---|
validate() |
проверяет все поля |
reset() |
очищает значения |
resetValidation() |
сбрасывает ошибки |
v-text-field поддерживает иконки.
prepend-icon)<v-text-field
label="Поиск"
prepend-icon="mdi-magnify"
></v-text-field>
append-icon)<v-text-field
label="Email"
append-icon="mdi-email"
></v-text-field>
Vuetify также поддерживает внутренние иконки.
<v-text-field
label="Поиск"
prepend-inner-icon="mdi-magnify"
></v-text-field>
Компонент генерирует стандартные события.
inputСрабатывает при изменении значения.
<v-text-field
@input="onInput"
></v-text-field>
changeСрабатывает при потере фокуса после изменения.
<v-text-field
@change="onChange"
></v-text-field>
focusСрабатывает при получении фокуса.
<v-text-field
@focus="onFocus"
></v-text-field>
blurСрабатывает при потере фокуса.
<v-text-field
@blur="onBlur"
></v-text-field>
Для блокировки редактирования используется свойство
disabled.
<v-text-field
label="ID пользователя"
disabled
></v-text-field>
Особенности:
Если значение должно отображаться, но не редактироваться,
используется readonly.
<v-text-field
label="ID"
value="12345"
readonly
></v-text-field>
Разница:
| Свойство | Поведение |
|---|---|
disabled |
поле полностью неактивно |
readonly |
поле активно, но текст нельзя изменить |
Vuetify поддерживает кнопку очистки.
<v-text-field
v-model="search"
label="Поиск"
clearable
></v-text-field>
При активации:
Для ограничения длины ввода используется counter.
<v-text-field
label="Комментарий"
counter="50"
></v-text-field>
Это отображает количество введённых символов.
Для реального ограничения используется maxlength.
<v-text-field
label="Комментарий"
counter
maxlength="50"
></v-text-field>
Vuetify предлагает несколько вариантов отображения поля.
outlinedПоле с рамкой.
<v-text-field
label="Имя"
outlined
></v-text-field>
Особенности:
filledПоле с заливкой фона.
<v-text-field
label="Имя"
filled
></v-text-field>
soloПоле без внешних границ.
<v-text-field
label="Поиск"
solo
></v-text-field>
solo-invertedИнвертированный вариант solo.
<v-text-field
label="Поиск"
solo-inverted
></v-text-field>
Свойство color управляет цветом активного состояния.
<v-text-field
label="Имя"
color="purple"
></v-text-field>
Цвет применяется к:
dense)Для компактного интерфейса используется dense.
<v-text-field
label="Имя"
dense
></v-text-field>
Эффект:
По умолчанию под полем отображается зона сообщений:
Её можно скрыть.
<v-text-field
label="Имя"
hide-details
></v-text-field>
Для форматированного ввода используется v-mask (через
сторонние плагины).
Пример маски телефона:
<v-text-field
v-mask="'+7 (###) ###-##-##'"
label="Телефон"
></v-text-field>
Маска автоматически:
При использовании type="number" компонент работает с
числовыми данными.
<v-text-field
label="Возраст"
type="number"
></v-text-field>
Дополнительные атрибуты:
<v-text-field
label="Количество"
type="number"
min="1"
max="10"
></v-text-field>
Через ref можно управлять компонентом.
<v-text-field
ref="nameField"
label="Имя"
></v-text-field>
Фокус программно:
this.$refs.nameField.focus()
Свойства компонента можно изменять реактивно.
<v-text-field
:disabled="isLoading"
label="Email"
></v-text-field>
Пример состояния загрузки:
data() {
return {
isLoading: false
}
}
<v-form ref="form">
<v-text-field
v-model="name"
label="Имя"
:rules="[v => !!v || 'Введите имя']"
></v-text-field>
<v-text-field
v-model="email"
label="Email"
type="email"
:rules="emailRules"
></v-text-field>
<v-text-field
v-model="password"
label="Пароль"
type="password"
counter="20"
></v-text-field>
</v-form>
Такой подход позволяет:
Компонент v-text-field остаётся фундаментальным
элементом интерфейсов на Vuetify благодаря гибкости, богатому набору
настроек и полной интеграции с системой форм Vue.