В библиотеке Atomico механизм reflect используется для
автоматической синхронизации свойств компонента с
атрибутами DOM, что позволяет поддерживать
двунаправленную связь между внутренним состоянием компонента и его
представлением в HTML. Это критически важно при работе с
веб-компонентами, где изменение атрибута должно корректно обновлять
внутреннее состояние, и наоборот.
reflectСвойства компонента объявляются с помощью функции prop
из Atomico. Параметр reflect указывает, будет ли значение
свойства автоматически отражаться в атрибуте DOM.
import { c, prop } from "atomico";
function myComponent({ color }) {
return <host style={{ color }}></host>;
}
myComponent.props = {
color: prop.string({ reflect: true })
};
customElements.define("my-component", c(myComponent));
Ключевые моменты:
reflect: true автоматически синхронизирует свойство
color с одноимённым атрибутом.color в DOM
обновляется.<my-component color="red"></my-component>),
свойство color обновляется и компонент реагирует на это
изменение.Не все типы свойств могут быть напрямую отражены в атрибутах. Atomico
поддерживает следующие типы с reflect:
true, его отсутствие — false.get и
set.Пример для boolean-свойства:
myComponent.props = {
visible: prop.boolean({ reflect: true })
};
// В DOM
// <my-component visible></my-component> => visible === true
// <my-component></my-component> => visible === false
Для чисел:
myComponent.props = {
size: prop.number({ reflect: true })
};
// В DOM
// <my-component size="42"></my-component> => size === 42
Если нужно синхронизировать более сложные данные (например, объект
или массив), используется комбинация свойств get и
set для кастомного преобразования:
myComponent.props = {
data: prop({
reflect: true,
get: (value) => JSON.parse(value || "{}"),
set: (value) => JSON.stringify(value)
})
};
// <my-component data='{"x":10,"y":20}'></my-component>
Здесь объект автоматически преобразуется в строку для атрибута и обратно в объект при чтении.
reflect обеспечивает двустороннюю связь между свойством
и атрибутом, что делает компонент гибким:
const el = document.querySelector("my-component");
el.color = "blue"; // атрибут color также становится "blue"
const el = document.querySelector("my-component");
el.setAttribute("color", "green"); // свойство color обновляется на "green"
Это особенно полезно при использовании компонентов в статических HTML-страницах, где атрибуты задаются сразу, или при интеграции с другими библиотеками и фреймворками.
number и
boolean проходят автоматическое преобразование.reflect не влияет на внутренние вычисляемые свойства
или состояния, которые не объявлены через prop.setAttribute инициирует
реакцию компонента, что может вызвать перерисовку.Использование reflect особенно удобно в следующих
сценариях:
my-component[visible] {
display: block;
}
reflect только для свойств, которые должны
быть видимы в DOM.reflect не нужен.Система reflect в Atomico обеспечивает чистый,
реактивный и предсказуемый способ синхронизации состояния компонентов с
их HTML-представлением, упрощая интеграцию с DOM и обеспечивая
полноценное использование возможностей веб-компонентов.