Slim.js — это минималистичная библиотека для создания веб-компонентов на JavaScript, ориентированная на простоту, производительность и реактивность. Компонент в Slim.js представляет собой изолированный блок интерфейса с собственным шаблоном, состоянием и логикой.
Компонент создаётся с помощью функции Slim.define,
которая принимает два аргумента: имя компонента и объект конфигурации.
Структура объекта конфигурации включает:
template — HTML-шаблон компонента.data — объект с начальными данными (состоянием).Пример базового компонента:
Slim.define('my-counter', {
template: `
<div>
<p>Счётчик: {count}</p>
<button oncl ick="increment()">Увеличить</button>
</div>
`,
data: {
count: 0
},
increment() {
this.count++;
}
});
Ключевые моменты:
template использует синтаксис {property}
для привязки данных.this.onclick.Slim.js автоматически отслеживает изменения в свойствах, объявленных
в data, и обновляет DOM при изменении этих свойств. Это
делает компоненты реактивными без необходимости вручную манипулировать
DOM.
Пример изменения состояния:
this.count += 1;
После выполнения этой строки Slim.js обновит содержимое шаблона,
заменив {count} на новое значение.
Компоненты Slim.js поддерживают несколько специальных методов жизненного цикла:
onBeforeCreated() — вызывается до создания компонента,
перед рендерингом.onCreated() — вызывается после рендеринга шаблона.onBeforeUpdate(prop, oldValue, newValue) — вызывается
перед обновлением свойства.onUpdated(prop, oldValue, newValue) — вызывается после
изменения свойства.Пример использования:
Slim.define('my-counter', {
template: `<p>{count}</p>`,
data: { count: 0 },
onCreated() {
console.log('Компонент создан');
},
onUpdated(prop, oldValue, newValue) {
console.log(`Свойство ${prop} изменено с ${oldValue} на ${newValue}`);
},
increment() {
this.count++;
}
});
Компоненты могут получать данные через HTML-атрибуты. Для этого
используется метод attributeChangedCallback. В Slim.js
можно просто объявить свойства в data, и библиотека
автоматически свяжет их с атрибутами компонента.
Пример передачи атрибута:
Slim.define('greeting-component', {
template: `<p>Привет, {name}!</p>`,
data: { name: 'Мир' }
});
Использование в HTML:
<greeting-component name="Алексей"></greeting-component>
После рендеринга шаблон покажет Привет, Алексей!.
Slim.js позволяет использовать компоненты внутри других компонентов. Для этого необходимо зарегистрировать компонент и вставить его тег в шаблон родителя.
Пример:
Slim.define('child-component', {
template: `<span>Я — дочерний компонент</span>`
});
Slim.define('parent-component', {
template: `
<div>
<p>Родительский компонент</p>
<child-component></child-component>
</div>
`
});
Slim.js автоматически создаст экземпляр дочернего компонента и встроит его в DOM родителя.
Slim.js поддерживает циклы и условные конструкции через синтаксис
#if и #for. Это позволяет генерировать
повторяющиеся элементы и управлять отображением элементов на основе
состояния.
Пример списка:
Slim.define('todo-list', {
template: `
<ul>
#for item INTOdos
<li>{item}</li>
#end
</ul>
`,
data: {
todos: ['Купить хлеб', 'Помыть машину', 'Прочитать книгу']
}
});
Каждый элемент массива todos будет отображён как
отдельный <li>.
Каждый компонент в Slim.js может содержать локальные стили с
использованием тега <style> внутри шаблона. Это
позволяет изолировать стили и избегать конфликтов с глобальными CSS.
Пример:
Slim.define('colored-box', {
template: `
<style>
div {
width: 100px;
height: 100px;
background-color: {color};
}
</style>
<div></div>
`,
data: { color: 'red' }
});
Изменение свойства color автоматически обновит цвет
блока.
Эти принципы позволяют создавать компактные, реактивные и легко управляемые компоненты в Slim.js, обеспечивая высокую производительность и гибкость при построении пользовательских интерфейсов.