Element Plus предоставляет мощный механизм валидации форм через
компонент <el-form> и его дочерние элементы
<el-form-item>. В дополнение к встроенным правилам
проверки, библиотека поддерживает пользовательские
валидаторы, которые позволяют реализовать сложные и
специфические проверки данных.
Пользовательский валидатор определяется как функция, принимающая три параметра:
rules.Простейший пример пользовательского валидатора для проверки, что поле содержит только буквы:
const onlyLettersValida tor = (rule, value, callback) => {
const regex = /^[A-Za-z]+$/;
if (!value) {
callback(new Error('Поле не может быть пустым'));
} else if (!regex.test(value)) {
callback(new Error('Поле должно содержать только буквы'));
} else {
callback();
}
};
В этом примере:
callback() без
параметров.<el-form-item>Для использования пользовательского валидатора необходимо добавить
его в массив rules при определении формы:
<el-form :model="form" :rules="rules" ref="formRef">
<el-form-item label="Имя" prop="name">
<el-input v-model="form.name"></el-input>
</el-form-item>
<el-button type="primary" @click="submitForm">Отправить</el-button>
</el-form>
<script>
import { ref } from 'vue';
export default {
setup() {
const form = ref({ name: '' });
const formRef = ref(null);
const onlyLettersValida tor = (rule, value, callback) => {
const regex = /^[A-Za-z]+$/;
if (!value) {
callback(new Error('Поле не может быть пустым'));
} else if (!regex.test(value)) {
callback(new Error('Поле должно содержать только буквы'));
} else {
callback();
}
};
const rules = {
name: [
{ validator: onlyLettersValidator, trigger: 'blur' }
]
};
const submitForm = () => {
formRef.value.validate((valid) => {
if (valid) {
console.log('Форма корректна', form.value);
} else {
console.log('Ошибка валидации');
return false;
}
});
};
return { form, rules, formRef, submitForm };
}
};
</script>
Ключевые моменты:
validator – функция проверки.trigger – событие, на которое срабатывает валидация
(blur, change).prop в <el-form-item> должен
совпадать с ключом правила в rules.Пользовательский валидатор может работать асинхронно, возвращая
Promise вместо использования callback. Это
полезно, когда проверка требует запроса к серверу, например, проверки
уникальности логина.
const asyncValidator = (rule, value) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (!value) {
reject(new Error('Поле обязательно для заполнения'));
} else if (value.length < 3) {
reject(new Error('Минимальная длина – 3 символа'));
} else {
resolve();
}
}, 500);
});
};
Использование такого валидатора:
rules: {
username: [
{ validator: asyncValidator, trigger: 'blur' }
]
}
Один <el-form-item> может содержать несколько
правил, включая комбинацию встроенных и пользовательских:
rules: {
password: [
{ required: true, message: 'Введите пароль', trigger: 'blur' },
{ min: 6, message: 'Пароль должен содержать минимум 6 символов', trigger: 'blur' },
{ validator: customPasswordValidator, trigger: 'blur' }
]
}
Такой подход позволяет:
Иногда нужно менять правила валидации на лету в зависимости от
состояния формы. Для этого можно обновлять объект rules и
вызывать метод clearValidate перед новой проверкой:
formRef.value.clearValidate('password');
rules.password = [
{ validator: dynamicValidatorBasedOnType(selectedType), trigger: 'blur' }
];
Это позволяет создавать формы с адаптивной логикой проверки без необходимости перезагрузки компонентов.
new Error('сообщение').
Для Promise-валидатора использовать
reject(new Error('сообщение')).trigger осознанно:
blur лучше для проверки после ввода, change —
для динамических обновлений.required, min, max,
pattern) удобно сочетать с пользовательскими для повышения
читаемости и поддержки кода.Пользовательские валидаторы в Element Plus позволяют реализовать гибкую, мощную и точную валидацию, управлять асинхронными процессами и создавать динамические формы без лишнего дублирования кода. Их грамотное применение повышает качество UX и надежность приложений на Vue 3.