Atomico — это библиотека для создания веб-компонентов на JavaScript с
реактивным подходом. Взаимодействие с DOM в Atomico построено вокруг
функции c, которая позволяет описывать компоненты
декларативно, и специальных хуков для управления состоянием и
эффектами.
В Atomico компонент определяется как функция, возвращающая структуру DOM через JSX-подобный синтаксис. Например:
import { c, useState } from "atomico";
function Counter() {
const [count, setCount] = useState(0);
return (
);
}
customElements.define("x-counter", c(Counter));
Ключевые моменты:
— корневой элемент компонента, аналог
Shadow DOM.c(Component) возвращает класс веб-компонента, который
можно регистрировать через customElements.define.onClick) и реактивные состояния
(useState) управляют содержимым компонента без прямого
доступа к DOM.Atomico предоставляет несколько хуков, которые упрощают работу с элементами и их состоянием.
useRefИспользуется для прямого доступа к DOM-элементу:
import { c, useRef } from "atomico";
function FocusInput() {
const inputRef = useRef();
return (
);
}
customElements.define("x-focus-input", c(FocusInput));
Особенности useRef:
current.useEffectПрименяется для управления побочными эффектами, например, для изменения DOM после рендера:
import { c, useEffect, useRef } from "atomico";
function Highlight() {
const divRef = useRef();
useEffect(() => {
divRef.current.style.backgroundColor = "yellow";
}, []);
return Подсвеченный блок ;
}
customElements.define("x-highlight", c(Highlight));
Принципы работы:
[]) задаёт зависимости: пустой массив
— выполняется один раз после монтирования.Компоненты Atomico по умолчанию используют Shadow DOM. Для вставки
внешнего содержимого применяется :
function Card() {
return (
);
}
customElements.define("x-card", c(Card));
,
автоматически попадёт в .Для взаимодействия с DOM через свойства и атрибуты компонента
используют props:
function Badge({ text }) {
return {text} ;
}
customElements.define("x-badge", c(Badge));
< x-badge text="Новый текст" >
Atomico позволяет подписываться на события прямо в JSX:
function Toggle() {
const [active, setActive] = useState(false);
return (
);
}
customElements.define("x-toggle", c(Toggle));
dispatchEvent:host.dispatchEvent(new CustomEvent("toggle", { detail: active }));
Хотя Atomico минимизирует прямое вмешательство в DOM, иногда это необходимо:
import { c, useEffect, useRef } from "atomico";
function ScrollToTop() {
const container = useRef();
useEffect(() => {
container.current.scrollTop = 0;
}, []);
return (
Длинный контент...
);
}
customElements.define("x-scroll-to-top", c(ScrollToTop));
ref и useEffect позволяет
безопасно изменять DOM после рендера.Стили применяются через стандартные CSS или через Shadow DOM:
function StyledBox() {
return (
);
}
customElements.define("x-styled-box", c(StyledBox));
изолирован компонентом.Atomico обновляет только изменённые узлы благодаря реактивности:
function List({ items }) {
return (
{items.map(item => - {item}
)}
);
}
customElements.define("x-list", c(List));
items изменятся только новые или
удалённые .