Atomico — это современная библиотека для создания
веб-компонентов на JavaScript с реактивным подходом, схожим с React и
Vue, но с акцентом на легковесность и совместимость с нативными
веб-технологиями. Центральным элементом является функция
c(), которая используется для определения компонентов. Она
сочетает декларативный синтаксис с реактивным состоянием, обработкой
событий и жизненным циклом компонентов.
c()Функция c() принимает в качестве аргумента
функцию компонента и возвращает Web
Component, готовый к использованию в DOM. Типовой синтаксис
выглядит так:
import { c, html } from "atomico";
const MyComponent = c(() => {
return html`
<div>Hello, Atomico!</div>
`;
});
c() принимает функцию компонента без параметров или с
объектом props.html используется для декларативного создания разметки,
подобно JSX, но без необходимости компиляции.c() — это класс Web Component,
который можно зарегистрировать через
customElements.define().propsProps позволяют передавать данные внутрь компонента и автоматически отслеживать их изменения. Пример использования:
const Greeting = c(({ name }) => {
return html`
<p>Hello, ${name}!</p>
`;
});
<greeting name="Alice"></greeting>
props.propsДля контроля типов и значений props используется объект
props на уровне компонента:
const Counter = c(
() => {
return html`<p>Counter component</p>`;
},
{
props: {
count: {
type: Number,
value: 0
},
label: {
type: String,
value: "Default"
}
}
}
);
type задаёт ожидаемый тип значения.value — значение по умолчанию.Для управления внутренним состоянием используется функция
useState:
import { c, html, useState } from "atomico";
const Counter = c(() => {
const [count, setCount] = useState(0);
return html`
<div>
<p>Count: ${count}</p>
<button oncl ick=${() => setCount(count + 1)}>Increment</button>
</div>
`;
});
useState возвращает массив
[state, setState].state вызывает автоматический
перерендер компонента.События привязываются напрямую через атрибуты, используя синтаксис
on[event]:
const Button = c(() => {
const handleClick = () => console.log("Clicked!");
return html`
<button oncl ick=${handleClick}>Click me</button>
`;
});
Atomico предоставляет хуки жизненного цикла, аналогичные React:
useEffect(callback, deps) — выполняет побочные эффекты
при изменении зависимостей.useHost — доступ к корневому DOM-узлу компонента.useRef — создание ссылок на элементы внутри
шаблона.Пример с useEffect:
import { c, html, useState, useEffect } from "atomico";
const Timer = c(() => {
const [seconds, setSeconds] = useState(0);
useEffect(() => {
const interval = setInterval(() => setSeconds(s => s + 1), 1000);
return () => clearInterval(interval);
}, []);
return html`<p>Seconds: ${seconds}</p>`;
});
useEffect позволяет корректно
очищать ресурсы.Atomico поддерживает инкапсулированные стили через шаблон
css:
import { c, html, css } from "atomico";
const StyledBox = c(() => {
return html`
<div class="box">Styled Box</div>
`;
}, {
styles: css`
.box {
padding: 10px;
background: #f0f0f0;
border: 1px solid #ccc;
}
`
});
После определения компонента его можно зарегистрировать в DOM:
customElements.define("my-component", MyComponent);
customElements.define() связывает имя элемента с
классом компонента.<my-component></my-component>
c, html,
useState, useEffect.c().props и реактивного состояния.on[event].css.customElements.define().Эта структура позволяет создавать лёгкие, реактивные и переиспользуемые веб-компоненты, полностью совместимые с нативными браузерными технологиями, при этом сохраняя декларативный и современный синтаксис JavaScript.