В библиотеке Slim.js жизненный цикл компонента играет ключевую роль в управлении его состоянием, рендерингом и взаимодействием с DOM. Каждый компонент проходит определённые этапы, начиная от инициализации и заканчивая удалением из DOM. Понимание этих этапов позволяет эффективно управлять ресурсами и предотвращать утечки памяти.
Инициализация происходит в момент создания экземпляра класса компонента. На этом этапе Slim.js:
observedAttributes или props.Метод constructor в компоненте Slim.js
вызывается сразу после создания экземпляра. В нём допустимо:
Прямой доступ к DOM на этом этапе может быть небезопасным, так как элемент ещё не присоединён к документу.
После добавления элемента на страницу Slim.js вызывает метод
connectedCallback(), который соответствует
моменту подключения элемента к DOM. На этом этапе можно:
this.querySelector
или this.shadowRoot.connectedCallback вызывается один раз при добавлении
элемента в DOM, что делает его идеальным местом для инициализации
внешних зависимостей.
Slim.js использует реактивную модель для обновления компонентов при изменении свойств. Основные моменты обновления:
observedAttributes), автоматически инициирует повторный
рендеринг.attributeChangedCallback(name, oldValue, newValue)
вызывается при изменении атрибутов, связанных с реактивными свойствами.
Это позволяет реагировать на внешние изменения и синхронизировать
состояние.render() отвечает за генерацию
DOM-структуры на основе текущего состояния компонента. Slim.js
автоматически вызывает render() при изменении реактивных
свойств.Реактивная система гарантирует минимальное количество операций с DOM, обновляя только те элементы, которые изменились. Это обеспечивает высокую производительность приложений.
Удаление компонента из DOM сопровождается вызовом метода
disconnectedCallback(). Этот этап важен
для освобождения ресурсов и предотвращения утечек памяти. В
disconnectedCallback рекомендуется:
Метод вызывается один раз при удалении элемента из DOM, что позволяет корректно завершать работу компонента и избегать накопления “висящих” обработчиков.
class MyComponent extends Slim {
static get observedAttributes() {
return ['title', 'count'];
}
constructor() {
super();
this.count = 0; // инициализация внутреннего состояния
}
connectedCallback() {
console.log('Компонент добавлен в DOM');
this.fetchData();
}
disconnectedCallback() {
console.log('Компонент удалён из DOM');
clearInterval(this.timer);
}
attributeChangedCallback(name, oldValue, newValue) {
console.log(`Атрибут ${name} изменён с ${oldValue} на ${newValue}`);
}
fetchData() {
// пример асинхронной операции
this.timer = setInterval(() => this.count++, 1000);
}
render() {
return `<div>
<h1>${this.title}</h1>
<p>Счётчик: ${this.count}</p>
</div>`;
}
}
Slim.tag('my-component', MyComponent);
В этом примере видны все этапы жизненного цикла: от инициализации
через constructor, взаимодействия с DOM в
connectedCallback, обновления через реактивное свойство
count и освобождения ресурсов в
disconnectedCallback.
constructor вызывается только один раз.Эффективное использование жизненного цикла компонентов позволяет строить масштабируемые приложения, минимизировать затраты ресурсов и поддерживать чистоту кода.