Atomico — это современная библиотека для создания веб-компонентов на основе JavaScript, предоставляющая функциональные возможности, схожие с реактивными библиотеками, но с упором на легковесность и нативную интеграцию с DOM. Одной из ключевых особенностей является возможность управления жизненным циклом компонентов через реактивные состояния, эффекты и хуки, что позволяет создавать гибкие и предсказуемые паттерны поведения.
Компоненты в Atomico имеют несколько основных фаз жизненного цикла:
Для управления этими фазами используются хуки useState,
useEffect, useRef, useMemo и
useCallback, что позволяет внедрять сложные циклы с
минимальными усилиями.
Состояние в Atomico создается с помощью функции
useState:
import { c, useState } from "atomico";
function Counter() {
const [count, setCount] = useState(0);
return (
<host>
<button onCl ick={() => setCount(count + 1)}>Increment</button>
<span>{count}</span>
</host>
);
}
customElements.define("x-counter", c(Counter));
useState возвращает массив
[state, setState].useEffect позволяет выполнять побочные действия после
обновления DOM или состояния:
import { useEffect } from "atomico";
useEffect(() => {
console.log("Component mounted or state changed");
return () => {
console.log("Cleanup before next effect or unmount");
};
}, [dependencies]);
dependencies определяет, когда будет
выполняться эффект. Если массив пустой, эффект сработает только при
монтировании и размонтировании.Для оптимизации вычислений используется useMemo:
import { useMemo } from "atomico";
const expensiveCalculation = useMemo(() => {
return computeHeavyData(input);
}, [input]);
useMemo пересчитывает значение только при изменении
зависимостей.Аналогично работает useCallback для мемоизации функций,
предотвращая ненужные пересоздания обработчиков:
const handleClick = useCallback(() => {
setCount(prev => prev + 1);
}, []);
useRef позволяет хранить ссылки на DOM-элементы:
import { useRef } from "atomico";
function InputFocus() {
const inputRef = useRef();
return (
<host>
<input ref={inputRef} />
<button onCl ick={() => inputRef.current.focus()}>Focus</button>
</host>
);
}
ref сохраняет прямую ссылку на элемент и не
вызывает повторного рендера.Atomico позволяет сочетать состояния, эффекты и мемоизацию для реализации сложных сценариев:
useEffect с очисткой через функцию возврата.Пример асинхронного эффекта:
useEffect(() => {
let isActive = true;
fetchData().then(data => {
if (isActive) setData(data);
});
return () => {
isActive = false;
};
}, []);
isActive предотвращает попытки обновления
состояния после размонтирования компонента, что снижает вероятность
ошибок.Atomico ориентирован на декларативный подход, где поведение описывается через зависимости и реактивные состояния, а не через императивные циклы. Это позволяет:
Использование этих паттернов позволяет создавать эффективные, устойчивые и легко поддерживаемые компоненты, минимизируя ошибки управления состоянием и ресурсами.