В Vuetify валидация форм строится вокруг свойства rules,
которое используется для компонентов ввода (v-text-field,
v-select, v-textarea и др.).
rules представляет собой массив функций, каждая из которых
принимает текущее значение поля и возвращает либо true
(если значение корректное), либо строку с сообщением об ошибке.
Пример базовой валидации для текстового поля:
<v-text-field
v-model="email"
label="Email"
:rules="[rules.required, rules.validEmail]"
></v-text-field>
<script>
export default {
data() {
return {
email: '',
rules: {
required: value => !!value || 'Поле обязательно для заполнения',
validEmail: value => /.+@.+\..+/.test(value) || 'Некорректный email'
}
}
}
}
</script>
Здесь ключевые моменты:
rules.required проверяет, что поле не пустое.rules.validEmail использует регулярное выражение для
проверки корректного формата email.Массив правил позволяет комбинировать несколько проверок для одного поля. Они выполняются последовательно, и при первом неудачном результате выводится соответствующее сообщение.
<v-text-field
v-model="password"
label="Пароль"
:rules="[rules.required, rules.minLength]"
type="password"
></v-text-field>
<script>
export default {
data() {
return {
password: '',
rules: {
required: value => !!value || 'Поле обязательно',
minLength: value => value.length >= 8 || 'Минимальная длина 8 символов'
}
}
}
}
</script>
Для более сложных условий можно использовать вычисляемые свойства
(computed) для динамического формирования правил.
computed: {
dynamicRules() {
return [
value => !!value || 'Обязательное поле',
value => (value && value.length <= this.maxLength) || `Максимум ${this.maxLength} символов`
]
}
}
В этом случае dynamicRules можно подключать к полям
через :rules="dynamicRules", и правила будут адаптироваться
к состоянию компонента (this.maxLength).
Vuetify предоставляет компонент v-form, который
объединяет поля и управляет их общей валидацией. У формы есть метод
validate() и свойство valid, позволяющее
проверить корректность всех полей одновременно.
<v-form ref="form">
<v-text-field v-model="name" :rules="[rules.required]" label="Имя"></v-text-field>
<v-text-field v-model="email" :rules="[rules.required, rules.email]" label="Email"></v-text-field>
<v-btn @click="submitForm">Отправить</v-btn>
</v-form>
<script>
export default {
data() {
return {
name: '',
email: '',
rules: {
required: value => !!value || 'Поле обязательно',
email: value => /.+@.+\..+/.test(value) || 'Неверный формат email'
}
}
},
methods: {
submitForm() {
if (this.$refs.form.validate()) {
console.log('Форма корректна, можно отправлять данные')
}
}
}
}
</script>
Особенности v-form:
ref используется для доступа к методам формы.validate() возвращает true, если все
поля прошли проверку.resetValidation() очищает состояние ошибок всех
полей.Валидация может быть не только синхронной. Например, проверка уникальности username на сервере требует асинхронного запроса. Vuetify поддерживает асинхронные функции в правилах:
rules: {
uniqueUsername: async value => {
if (!value) return 'Поле обязательно'
const response = await fetch(`/api/check-username?username=${value}`)
const result = await response.json()
return result.available || 'Имя пользователя занято'
}
}
При использовании асинхронных правил необходимо учитывать, что метод
validate() формы тоже становится асинхронным, поэтому его
следует вызывать с await.
Иногда требуется валидировать поле только при определенных условиях. Для этого можно включать проверку прямо в функцию правила:
rules: {
conditionalRequired: value => {
if (this.isActive) {
return !!value || 'Поле обязательно при активном статусе'
}
return true
}
}
Здесь правило зависит от состояния компонента isActive и
позволяет динамически включать или отключать проверку.
Vuetify автоматически показывает сообщение об ошибке под полем ввода, но можно управлять этим через свойства:
error – вручную включить состояние ошибки.error-messages – указать массив сообщений об
ошибке.success и success-messages – показать
состояние успеха.<v-text-field
v-model="username"
:error="usernameError"
:error-messages="['Неверное имя пользователя']"
></v-text-field>
v-form для объединения полей, чтобы
централизованно управлять валидацией.rules для комбинирования
стандартных и кастомных проверок.async/await
вместе с методами формы.computed или функции, зависящие от состояния
компонента.Эти подходы обеспечивают гибкую, масштабируемую и легко поддерживаемую систему валидации в приложениях на Vuetify.