В Slim.js валидация данных тесно связана с компонентной архитектурой и реактивностью. Каждое свойство компонента можно контролировать с помощью геттеров и сеттеров, а также специализированных методов для проверки значений. Это позволяет поддерживать корректность состояния интерфейса и предотвращать некорректные изменения данных.
В Slim.js свойства компонента объявляются через объект
props или через реактивные геттеры/сеттеры внутри класса
компонента. Для валидации можно использовать следующие подходы:
class UserForm extends Slim {
email = '';
age = 0;
set email(value) {
if (!this.validateEmail(value)) {
throw new Error('Некорректный email');
}
this._email = value;
this.update();
}
get email() {
return this._email;
}
validateEmail(value) {
const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return regex.test(value);
}
}
Ключевые моменты:
_email предотвращает
бесконтрольное изменение данных.UPDATE() обеспечивает реактивное обновление
компонента после изменения валидного значения.Slim.js позволяет создавать формы с реактивной валидацией. Каждый
ввод можно привязать к свойству компонента с обработкой событий
input или change. Валидация может выполняться
динамически при каждом изменении значения.
<form>
<input type="text" onin put="this.component.username = this.value">
<span id="error"></span>
</form>
class UserForm extends Slim {
username = '';
se t username(value) {
const errorElement = this.$('span#error');
if (value.length < 3) {
errorElement.textContent = 'Имя должно быть минимум 3 символа';
} else {
errorElement.textContent = '';
this._username = value;
this.update();
}
}
get username() {
return this._username;
}
}
Особенности:
this.$().Для сложных форм используется комбинация нескольких функций валидации. Это позволяет разделять логику проверки и повышает читаемость кода.
class RegistrationForm extends Slim {
password = '';
confirmPassword = '';
set password(value) {
this._password = value;
this.validatePasswords();
this.update();
}
set confirmPassword(value) {
this._confirmPassword = value;
this.validatePasswords();
this.update();
}
validatePasswords() {
if (this._password !== this._confirmPassword) {
this.$('span#error').textContent = 'Пароли не совпадают';
} else {
this.$('span#error').textContent = '';
}
}
}
Выводы по композиции:
Slim.js поддерживает создание директив для автоматической валидации. Директива может проверять значение при вводе и изменять отображение DOM без вмешательства в логику компонента.
Slim.directive('validateEmail', (el, email) => {
const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
el.style.borderColor = regex.test(email) ? 'green' : 'red';
});
Применение:
<input type="text" bind="email" validate-email>
Slim.js позволяет интегрировать асинхронные проверки, например,
запрос к серверу для проверки уникальности логина. Асинхронная валидация
выполняется через промисы или async/await внутри
сеттеров.
class UserForm extends Slim {
username = '';
async set username(value) {
const isAvailable = await this.checkUsername(value);
if (!isAvailable) {
this.$('span#error').textContent = 'Логин уже занят';
} else {
this._username = value;
this.$('span#error').textContent = '';
this.update();
}
}
async checkUsername(username) {
const response = await fetch(`/api/check-username?username=${username}`);
const data = await response.json();
return data.available;
}
}
Для больших приложений рекомендуется использовать централизованные валидаторы или вспомогательные библиотеки, интегрируемые с Slim.js. Это позволяет стандартизировать правила проверки и упрощает поддержку кода.
validators.js).Валидация данных в Slim.js строится на реактивных свойствах, сеттерах и геттерах, а также поддерживается через директивы и асинхронные проверки. Такой подход обеспечивает чистоту кода, мгновенную обратную связь и масштабируемость при создании сложных интерфейсов.