Haunted — это минималистичная библиотека для создания веб-компонентов на базе Web Components с использованием реактивного подхода. Одной из ключевых задач при построении компонентной архитектуры является передача данных от родительского компонента к дочернему. Haunted предлагает несколько эффективных способов организации “data down”, обеспечивая ясность и предсказуемость потоков данных.
props)В Haunted передача данных вниз реализуется через свойства
компонентов, которые создаются при помощи функции
component. Свойства аналогичны props в
React: они позволяют родителю передавать значения в дочерний компонент
при рендеринге.
import { html, component } from 'haunted';
function Child({ message }) {
return html`<p>${message}</p>`;
}
customElements.define('child-element', component(Child));
function Parent() {
const message = "Привет из родителя!";
return html`<child-element .message=${message}></child-element>`;
}
customElements.define('parent-element', component(Parent));
Ключевые моменты:
.) перед именем свойства
гарантирует передачу значения как JavaScript объекта, а не как строки
атрибута HTML.Haunted предоставляет возможность реагировать на изменения свойств
через useEffect. Это позволяет отслеживать
обновления данных и выполнять побочные действия:
import { html, component, useEffect } from 'haunted';
function Child({ count }) {
useEffect(() => {
console.log(`Новое значение count: ${count}`);
}, [count]);
return html`<p>Count: ${count}</p>`;
}
customElements.define('child-element', component(Child));
Пояснения:
useEffect вызывается каждый раз при изменении значений
в массиве зависимостей.Haunted позволяет передавать объекты, массивы и функции как свойства дочернего компонента:
function Child({ user }) {
return html`
<p>Имя: ${user.name}</p>
<p>Возраст: ${user.age}</p>
`;
}
function Parent() {
const user = { name: 'Алексей', age: 30 };
return html`<child-element .user=${user}></child-element>`;
}
Особенности:
При передаче объектов и массивов важно помнить о мутабельности. Если объект изменяется без создания нового, Haunted может не заметить обновление. Рекомендуется использовать создание нового объекта при изменении данных:
user.age = 31; // ❌ может не обновиться
const newUser = { ...user, age: 31 }; // ✅ гарантирует обновлениеДочерние компоненты могут получать функции от родителя для вызова обратного действия или выполнения бизнес-логики:
function Child({ onClick }) {
return html`<button @click=${onClick}>Нажми меня</button>`;
}
function Parent() {
const handleClick = () => console.log('Кнопка нажата в дочернем компоненте');
return html`<child-element .onCl ick=${handleClick}></child-element>`;
}
.).Haunted поддерживает значения по умолчанию для свойств, что удобно для обеспечения устойчивости компонента:
function Child({ message = 'Сообщение по умолчанию' }) {
return html`<p>${message}</p>`;
}
Передача данных вниз в Haunted строится на свойствах компонентов, которые поддерживают реактивное обновление, сложные структуры и функции. Ключевые принципы:
Эта модель обеспечивает односторонний поток данных, делая архитектуру компонентов предсказуемой и легко поддерживаемой.