Validator.js представляет собой набор чистых функций для проверки строковых значений и базовых типов данных. Библиотека не навязывает архитектуру и легко встраивается в любые JavaScript-приложения, включая приложения на Vue.js, где реактивность и управление состоянием форм требуют аккуратной организации логики валидации.
Vue.js предоставляет реактивную модель данных, вычисляемые свойства и наблюдатели, что позволяет строить валидацию как синхронную реакцию на изменение состояния формы. В сочетании с Validator.js это формирует гибкую систему проверки данных без необходимости подключения тяжёлых фреймворков валидации.
Базовая установка выполняется через пакетный менеджер:
npm install validator
После установки функции импортируются точечно, чтобы уменьшить размер бандла:
import isEmail from 'validator/lib/isEmail'
import isLength from 'validator/lib/isLength'
Такой подход предпочтителен при использовании Vue CLI или Vite, поскольку позволяет избежать загрузки всей библиотеки целиком.
В классической модели Vue компонента валидация часто реализуется через computed-свойства и методы.
import isEmail from 'validator/lib/isEmail'
export default {
data() {
return {
form: {
email: '',
password: ''
}
}
},
computed: {
emailError() {
if (!this.form.email) {
return 'Поле обязательно'
}
if (!isEmail(this.form.email)) {
return 'Некорректный email'
}
return ''
}
}
}
Computed-свойства позволяют автоматически пересчитывать ошибки при каждом изменении поля без ручного вызова функций проверки.
В современных приложениях на Vue 3 предпочтение отдаётся Composition API, где логика валидации становится более изолированной.
import { reactive, computed } from 'vue'
import isLength from 'validator/lib/isLength'
export function useFormValidation() {
const form = reactive({
username: '',
password: ''
})
const usernameError = computed(() => {
if (!isLength(form.username, { min: 3 })) {
return 'Минимальная длина — 3 символа'
}
return ''
})
const passwordError = computed(() => {
if (!isLength(form.password, { min: 6 })) {
return 'Минимальная длина — 6 символов'
}
return ''
})
return {
form,
usernameError,
passwordError
}
}
Такой подход позволяет повторно использовать логику валидации в разных компонентах без дублирования кода.
Иногда валидация выполняется не через computed, а через методы, привязанные к событиям формы.
import isEmail from 'validator/lib/isEmail'
export default {
data() {
return {
email: '',
emailError: ''
}
},
methods: {
validateEmail() {
if (!isEmail(this.email)) {
this.emailError = 'Email некорректен'
} else {
this.emailError = ''
}
}
}
}
Использование событий input или blur
позволяет контролировать момент выполнения проверки, снижая нагрузку при
больших формах.
Vue.js позволяет выносить валидацию в пользовательские директивы, что уменьшает количество кода внутри компонентов.
import isEmpty from 'validator/lib/isEmpty'
export default {
mounted(el, binding) {
el.addEventListener('blur', () => {
const value = el.value
const error = isEmpty(value) ? binding.value.message : ''
binding.value.setError(error)
})
}
}
Такой механизм подходит для повторяющихся полей, где логика проверки одинакова.
Validator.js ориентирован на синхронные проверки, однако в связке с Vue можно строить гибридные сценарии, включая асинхронные запросы.
import isEmail from 'validator/lib/isEmail'
async function checkEmailExists(email) {
const response = await fetch(`/api/check-email?email=${email}`)
return response.ok
}
export default {
data() {
return {
email: '',
error: ''
}
},
watch: {
async email(newValue) {
if (!isEmail(newValue)) {
this.error = 'Некорректный формат'
return
}
const exists = await checkEmailExists(newValue)
this.error = exists ? 'Email уже используется' : ''
}
}
}
Watchers позволяют реагировать на изменения состояния и комбинировать локальную и серверную валидацию.
При усложнении форм удобно строить наборы правил как отдельные функции:
import isLength from 'validator/lib/isLength'
import isAlphanumeric from 'validator/lib/isAlphanumeric'
export function validateUsername(value) {
if (!isLength(value, { min: 3 })) return 'Слишком короткий логин'
if (!isAlphanumeric(value)) return 'Только буквы и цифры'
return ''
}
Далее функция используется в любом компоненте без привязки к Vue:
computed: {
usernameError() {
return validateUsername(this.username)
}
}
При использовании v-model удобно синхронизировать
значение и ошибку через объект состояния:
import isEmail from 'validator/lib/isEmail'
export default {
data() {
return {
form: {
email: '',
errors: {
email: ''
}
}
}
},
watch: {
'form.email'(value) {
this.form.errors.email = isEmail(value)
? ''
: 'Ошибка формата email'
}
}
}
Такой подход позволяет централизованно хранить состояние формы.
При больших формах важно избегать лишних пересчётов. Vue реактивность может вызывать частые обновления, поэтому применяются:
Пример дебаунса:
import isEmail from 'validator/lib/isEmail'
let timeout
export default {
data() {
return {
email: '',
error: ''
}
},
methods: {
onInput() {
clearTimeout(timeout)
timeout = setTimeout(() => {
this.error = isEmail(this.email)
? ''
: 'Неверный email'
}, 300)
}
}
}
В крупных проектах Vue логика проверки часто выносится в отдельные слои:
services/validationcomposables/useValidationutils/rulesValidator.js при этом остаётся низкоуровневым инструментом, выполняющим только проверку значений, тогда как Vue-компоненты управляют состоянием интерфейса.
Разделение ответственности позволяет избежать смешивания UI-логики и бизнес-правил, сохраняя предсказуемость поведения форм при росте приложения.