Slim.js — это лёгкая и эффективная библиотека для
создания компонентов с реактивным обновлением DOM. Одним из ключевых
аспектов работы с компонентами является двусторонняя привязка
данных к полям ввода, которая позволяет синхронизировать
состояние модели и отображение без необходимости вручную отслеживать
события input или change.
bindДля связывания свойства компонента с элементом формы используется
директива bind. Она поддерживает все стандартные элементы
HTML: <input>, <textarea>,
<select> и их разновидности.
Пример привязки текстового поля к свойству компонента:
class UserForm extends Slim {
name = '';
constructor() {
super();
}
submitForm() {
console.log(this.name);
}
}
UserForm.useTemplate(`
<form on:submit.prevent="submitForm">
<input type="text" bind="name" placeholder="Введите имя">
<button type="submit">Отправить</button>
</form>
`);
customElements.define('user-form', UserForm);
Здесь bind="name" обеспечивает автоматическую
синхронизацию значения поля с свойством name
класса. Любое изменение в поле ввода мгновенно обновляет свойство
компонента, а при программном изменении this.name —
автоматически обновляется отображение в поле.
Для <input> с type="number" или
type="checkbox" Slim.js выполняет автоматическое
преобразование типов:
<input type="number" bind="age">
<input type="checkbox" bind="isActive">
true/false синхронизируется
с состоянием свойства.Это устраняет необходимость вручную конвертировать типы и следить за состоянием формы.
Привязка данных работает не только с примитивными типами. Можно связывать поля с вложенными свойствами объектов и элементами массивов. Для этого используется синтаксис с точечной нотацией:
class ProfileForm extends Slim {
user = {
firstName: '',
lastName: ''
};
}
ProfileForm.useTemplate(`
<input type="text" bind="user.firstName" placeholder="Имя">
<input type="text" bind="user.lastName" placeholder="Фамилия">
`);
Изменения в поле firstName автоматически обновят объект
user, сохраняя реактивность.
Иногда требуется выполнять дополнительные действия при изменении
поля. Slim.js позволяет комбинировать bind с обработчиками
событий on:input или on:change:
<input type="text" bind="email" on:input="validateEmail">
Метод validateEmail класса будет вызываться при каждом
вводе, при этом свойство email уже обновлено.
validateEmail() {
if (!this.email.includes('@')) {
console.warn('Некорректный email');
}
}
Это обеспечивает гибкость и контроль без потери автоматической синхронизации.
Для <select> и <option> Slim.js
поддерживает привязку через bind:
class CountrySelector extends Slim {
country = '';
countries = ['Россия', 'США', 'Германия'];
}
CountrySelector.useTemplate(`
<select bind="country">
<option each="countryItem in countries" value="countryItem">{{countryItem}}</option>
</select>
`);
country автоматически принимает выбранное
значение.this.country обновит выделение в
списке.Привязка в Slim.js полностью реактивна. Если изменяется значение
свойства из кода, поле ввода обновляется без дополнительных вызовов
setState или render. Пример:
this.name = 'Алексей'; // Поле <input> автоматически отобразит новое имя
Эта функциональность делает работу с формами интуитивной и безопасной, устраняя частые ошибки синхронизации данных.
this.input,
change) и их комбинация с bind.Привязка данных может быть использована вместе с вычисляемыми свойствами (getter):
class NameForm extends Slim {
firstName = '';
lastName = '';
get fullName() {
return `${this.firstName} ${this.lastName}`;
}
}
NameForm.useTemplate(`
<input type="text" bind="firstName">
<input type="text" bind="lastName">
<p>Полное имя: {{fullName}}</p>
`);
fullName обновляется автоматически при изменении
firstName или lastName, демонстрируя
реактивность цепочек привязки.
Привязка данных в Slim.js делает формы и пользовательский ввод максимально прозрачными, сокращая объем кода и устраняя необходимость вручную следить за состоянием полей.