Slim.js — это легковесная библиотека для создания веб-компонентов с использованием декларативного подхода. Ключевой особенностью является возможность определения методов компонента, которые управляют его состоянием, реагируют на события и обеспечивают взаимодействие с DOM.
Методы в Slim.js определяются внутри класса компонента через объект,
передаваемый в функцию Slim.tag. Класс компонента наследует
жизненный цикл Slim.js, что позволяет использовать методы для обработки
событий, изменения состояния и обновления интерфейса.
Slim.tag('my-component', class extends Slim {
constructor() {
super();
this.count = 0;
}
increment() {
this.count++;
this.update();
}
decrement() {
this.count--;
this.update();
}
render() {
return `
<div>
<button oncl ick="${this.decrement}">-</button>
<span>${this.count}</span>
<button oncl ick="${this.increment}">+</button>
</div>
`;
}
});
Ключевые моменты:
this.update(), чтобы Slim.js перерисовал DOM.oncl ick="${this.increment}".Slim.js предоставляет несколько методов жизненного цикла, которые можно использовать для инициализации, обновления и удаления компонентов:
onBeforeCreated(): вызывается до создания компонента,
полезно для установки начального состояния.onCreated(): срабатывает после создания компонента,
удобно для добавления подписок или асинхронных операций.onBeforeUpdate(): вызывается перед обновлением DOM,
можно проверять условия обновления.onUpdated(): срабатывает после обновления, используется
для выполнения действий над уже обновлённым DOM.onDisconnected(): вызывается при удалении компонента из
DOM, позволяет очистить ресурсы.Пример использования методов жизненного цикла совместно с пользовательскими методами:
Slim.tag('timer-component', class extends Slim {
constructor() {
super();
this.seconds = 0;
}
onCreated() {
this.timer = setInterval(() => this.tick(), 1000);
}
tick() {
this.seconds++;
this.update();
}
onDisconnected() {
clearInterval(this.timer);
}
render() {
return `<div>Прошло секунд: ${this.seconds}</div>`;
}
});
Выводы по жизненному циклу:
В Slim.js методы компонентов автоматически связываются с
контекстом this, поэтому не требуется ручная
привязка через .bind(this). Это упрощает работу с
обработчиками событий и внутренними функциями компонента.
Slim.tag('toggle-component', class extends Slim {
constructor() {
super();
this.active = false;
}
toggle() {
this.active = !this.active;
this.update();
}
render() {
return `
<button oncl ick="${this.toggle}">
${this.active ? 'Включено' : 'Выключено'}
</button>
`;
}
});
Особенности привязки:
this.Slim.js позволяет организовать взаимодействие между компонентами через методы. Для этого используется стандартный DOM API, события или прямой вызов методов дочернего компонента.
Пример вызова метода дочернего компонента:
Slim.tag('parent-component', class extends Slim {
callChildMethod() {
this.querySelector('child-component').childMethod();
}
render() {
return `
<child-component></child-component>
<button oncl ick="${this.callChildMethod}">Вызвать метод ребенка</button>
`;
}
});
Slim.tag('child-component', class extends Slim {
childMethod() {
console.log('Метод дочернего компонента вызван');
}
render() {
return `<div>Дочерний компонент</div>`;
}
});
Рекомендации по взаимодействию:
Методы компонентов могут быть асинхронными, что особенно полезно для работы с API или таймерами:
Slim.tag('fetch-component', class extends Slim {
constructor() {
super();
this.data = null;
}
async loadData() {
const response = await fetch('https://jsonplaceholder.typicode.com/todos/1');
this.data = await response.json();
this.update();
}
onCreated() {
this.loadData();
}
render() {
return this.data
? `<div>Загруженные данные: ${this.data.title}</div>`
: `<div>Загрузка...</div>`;
}
});
Особенности асинхронных методов:
async/await полностью поддерживается.this.update().Методы компонентов Slim.js являются центральным инструментом для управления состоянием, обработки событий и интеграции с внешними источниками данных. Правильное использование методов вместе с жизненным циклом, автоматической привязкой контекста и асинхронными возможностями обеспечивает гибкость и стабильность компонентов.
Методы могут быть:
Эта структура делает Slim.js удобным инструментом для построения сложных, реактивных веб-компонентов с минимальным объемом кода и высокой читаемостью.