useProp — это хук библиотеки Atomico, предназначенный
для управления свойствами (props) веб-компонентов. Он позволяет
синхронизировать состояние компонента с внешними данными, получать
уведомления о их изменениях и обеспечивать реактивное поведение без
необходимости вручную подписываться на события.
Свойство создается с помощью вызова useProp, который
принимает имя свойства и опциональные параметры:
import { c, useProp, html } from "atomico";
function MyComponent() {
const myProp = useProp("myProp", { type: String, value: "default" });
return html`<p>${myProp.value}</p>`;
}
customElements.define("my-component", c(MyComponent));
Ключевые моменты:
type определяет тип данных свойства (String, Number,
Boolean, Object, Array).value задает начальное значение свойства..value для чтения и
записи свойства.Изменение значения через .value автоматически отражается
в DOM и вызывает повторный рендер компонента:
myProp.value = "новое значение";
Atomico отслеживает изменения, и компонент обновляется только при необходимости, что минимизирует перерисовку.
Свойства, созданные через useProp, могут быть связаны с
атрибутами веб-компонента:
const visible = useProp("visible", { type: Boolean, reflect: true });
reflect: true синхронизирует свойство с
HTML-атрибутом компонента.visible.value атрибут
visible на элементе обновляется автоматически, и
наоборот.useProp поддерживает реактивные подписки через свойство
.onChange:
const count = useProp("count", { type: Number });
count.onCha nge = (newValue, oldValue) => {
console.log(`Старое значение: ${oldValue}, новое: ${newValue}`);
};
onChange вызывается при каждом изменении значения
свойства.useEffect.Для объектов и массивов требуется особое внимание, чтобы изменения внутри структуры также отслеживались:
const config = useProp("config", { type: Object, value: { theme: "light" } });
config.value.theme = "dark";
config.value = { ...config.value }; // Триггер перерендера
С помощью useProp можно строить зависимости между
свойствами:
const width = useProp("width", { type: Number });
const height = useProp("height", { type: Number });
const area = useProp("area", { type: Number, value: width.value * height.value });
width.onCha nge = () => area.value = width.value * height.value;
height.onCha nge = () => area.value = width.value * height.value;
При объявлении свойства можно использовать:
type — определяет ожидаемый тип значения.value — задает дефолтное значение.reflect — управляет синхронизацией с атрибутом.readonly — делает свойство только для чтения внутри
компонента.const title = useProp("title", { type: String, value: "Заголовок", readonly: true });
title.value вызовет предупреждение,
что свойство только для чтения.reflect только при
необходимости. Частая синхронизация с атрибутами может повлиять
на производительность.onChange заменяют локальные
эффекты. Это снижает количество стороннего кода и делает
компоненты более предсказуемыми.useProp является ключевым инструментом для создания
реактивных и управляемых компонентов в Atomico. Правильное использование
его возможностей позволяет строить компоненты с минимальным кодом,
высокой производительностью и удобным интерфейсом для взаимодействия
через свойства и атрибуты.