Slim.js — это легковесная JavaScript-библиотека для создания компонентного интерфейса с реактивным управлением состоянием. Одной из ключевых возможностей является двусторонняя привязка данных, которая позволяет синхронизировать состояние модели и интерфейс пользователя без постоянного ручного обновления DOM.
В Slim.js привязка данных строится на декларативных атрибутах в HTML-шаблонах и реактивных свойствах компонентов.
В Slim.js каждое свойство компонента, объявленное как
observed, становится реактивным. Это
значит, что любое изменение значения автоматически отражается в DOM:
import Slim from 'slim-js';
class UserForm extends Slim {
static get observed() {
return ['username', 'email'];
}
constructor() {
super();
this.username = '';
this.email = '';
}
submitForm() {
console.log(`Имя: ${this.username}, Email: ${this.email}`);
}
}
Slim.define('user-form', UserForm);
В этом примере username и email —
реактивные свойства. Любые изменения этих полей автоматически обновляют
связанные элементы в шаблоне.
bindДля двусторонней привязки Slim.js использует атрибут
bind. Он связывает свойство компонента с HTML-элементом
формы:
<user-form>
<input type="text" bind="username">
<input type="email" bind="email">
<button on-click="submitForm">Отправить</button>
</user-form>
При вводе текста в поле input свойство
username автоматически обновляется, и наоборот — если
значение username изменится программно, поле ввода
синхронизируется.
Особенности работы bind:
input,
textarea, select.Slim.js позволяет выбирать между односторонней и
двусторонней привязкой. Односторонняя привязка
осуществляется через атрибут text или
html:
<span text="username"></span>
Здесь изменения username обновляют содержимое
span, но изменение DOM не влияет на свойство
username.
Двусторонняя привязка (bind)
обеспечивает синхронизацию в обоих направлениях — пользовательский ввод
сразу меняет свойство, а изменение свойства программно меняет
отображение.
Привязка не ограничена простыми типами данных. Для объектов и массивов можно использовать реактивные структуры:
class TaskList extends Slim {
static get observed() { return ['tasks']; }
constructor() {
super();
this.tasks = [
{ title: 'Сделать домашку', done: false },
{ title: 'Прочитать статью', done: false }
];
}
toggleTask(index) {
this.tasks[index].done = !this.tasks[index].done;
this.tasks = [...this.tasks]; // обновление массива для реактивности
}
}
Slim.define('task-list', TaskList);
Привязка к массиву осуществляется через repeat и
bind:
<task-list>
<ul>
<li repeat="tasks">
<input type="checkbox" bind="done">
<span text="title"></span>
</li>
</ul>
</task-list>
Любое изменение состояния задачи (done) сразу отражается
в интерфейсе, и изменение галочки через UI обновляет массив.
Slim.js позволяет комбинировать bind с событиями:
<input type="text" bind="username" on-input="validateUsername">
Метод validateUsername вызывается при каждом изменении
значения, что позволяет реализовать валидацию данных в реальном времени,
не ломая привязку.
Хотя двусторонняя привязка облегчает синхронизацию данных и интерфейса, важно помнить:
bind на больших
списках может создавать ненужные перерендеры.spread,
map, filter), чтобы Slim.js мог правильно
отследить изменения.Двусторонняя привязка позволяет легко интегрировать данные из API:
fetch('/api/user')
.then(res => res.json())
.then(data => {
userForm.username = data.username;
userForm.email = data.email;
});
После установки значений через скрипт поля формы обновляются
автоматически благодаря реактивным свойствам и bind.
Двусторонняя привязка Slim.js превращает компоненты в реактивные модули, где состояние и интерфейс находятся в постоянном синхронном взаимодействии, обеспечивая чистый и поддерживаемый код.