Slim.js — это лёгкая и реактивная библиотека для создания веб-компонентов с использованием декларативного подхода. Одной из ключевых возможностей является эффективная передача данных между компонентами. В частности, передача данных от родительского компонента к дочернему играет важную роль в построении масштабируемых интерфейсов.
Передача данных начинается с определения свойств
(properties) в дочернем компоненте. В Slim.js это делается с
помощью массива props, который указывается при описании
компонента:
import Slim from 'slim-js';
class ChildComponent extends Slim {
static get props() {
return ['title', 'count'];
}
render() {
return `
<div>
<h2>${this.title}</h2>
<p>Количество: ${this.count}</p>
</div>
`;
}
}
Slim.define('child-component', ChildComponent);
Здесь title и count становятся
реактивными свойствами, изменения которых автоматически
отражаются в DOM дочернего компонента.
В родительском компоненте значения передаются дочернему через атрибуты HTML, соответствующие свойствам:
class ParentComponent extends Slim {
constructor() {
super();
this.title = 'Пример передачи данных';
this.count = 42;
}
render() {
return `
<child-component title="${this.title}" count="${this.count}"></child-component>
`;
}
}
Slim.define('parent-component', ParentComponent);
Особенности передачи:
{} в
Slim.js 4.x.Slim.js обеспечивает реактивность: любые изменения свойств родителя, переданных через атрибуты, вызывают повторный рендер дочернего компонента. Пример:
class ParentComponent extends Slim {
static get props() {
return ['count'];
}
constructor() {
super();
this.count = 0;
}
increment() {
this.count++;
}
render() {
return `
<button oncl ick="${() => this.increment()}">Увеличить</button>
<child-component count="${this.count}"></child-component>
`;
}
}
При нажатии на кнопку значение count обновляется в
родителе и автоматически передается дочернему компоненту.
Передача сложных данных (объектов, массивов) требует особого подхода, так как HTML-атрибуты работают только со строками. В Slim.js можно использовать прямое связывание через свойства:
class ChildComponent extends Slim {
static get props() {
return ['data'];
}
render() {
return `
<ul>
${this.data.map(item => `<li>${item}</li>`).join('')}
</ul>
`;
}
}
Slim.define('child-component', ChildComponent);
class ParentComponent extends Slim {
constructor() {
super();
this.items = ['яблоко', 'банан', 'вишня'];
}
render() {
const child = document.createElement('child-component');
child.data = this.items;
return child;
}
}
Slim.define('parent-component', ParentComponent);
В этом примере data передается напрямую через свойство
объекта, минуя строковое представление в атрибуте.
Для реактивного отслеживания изменений в объектах и массивах используют методы манипуляции данных родителя с последующим присвоением обновленного объекта дочернему компоненту:
addItem(newItem) {
this.items = [...this.items, newItem]; // создается новый массив
}
Это гарантирует, что реактивная система Slim.js заметит изменение и обновит DOM дочернего компонента.
props.Передача данных от родителя к потомку в Slim.js является основой реактивного потока информации, обеспечивая синхронизацию состояния и динамическое обновление интерфейса без излишнего кода и сложных подписок.