Haunted — это библиотека для создания веб-компонентов с использованием функционального подхода, построенного на хуках, аналогичных React. Правильное именование компонентов и связанных сущностей имеет критическое значение для читаемости кода, масштабируемости проекта и интеграции с другими библиотеками.
Компоненты в Haunted всегда определяются как функции. Имя функции должно начинаться с заглавной буквы. Это позволяет отличать пользовательские компоненты от обычных HTML-элементов и поддерживает стандартное поведение веб-компонентов. Например:
import { html, component } from 'haunted';
function UserCard({ name, age }) {
return html`<div>${name}, ${age} лет</div>`;
}
customElements.define('user-card', component(UserCard));
UserCarduser-cardРекомендации:
Haunted автоматически связывает атрибуты HTML с пропсами компонента, но это связывание чувствительно к регистру и формату имен.
kebab-casecamelCaseПример корректного связывания:
function ProfileCard({ userName, userAge }) {
return html`<p>${userName} — ${userAge} лет</p>`;
}
customElements.define('profile-card', component(ProfileCard));
HTML:
<profile-card user-name="Иван" user-age="30"></profile-card>
Важно: user-name автоматически
преобразуется в проп userName.
Haunted предоставляет набор хуков: useState,
useEffect, useReducer, и другие. Имена хуков
начинаются с use и пишутся в
camelCase:
import { useState } from 'haunted';
function Counter() {
const [count, setCount] = useState(0);
return html`<button @click=${() => setCount(count + 1)}>Счёт: ${count}</button>`;
}
customElements.define('counter-button', component(Counter));
handle, например: handleClick,
handleSubmit.Именование событий в Haunted и веб-компонентах должно соответствовать общепринятой практике:
kebab-case,
часто с префиксом компонента для избежания конфликтов.on<Event>,
например, onClick, onChange.Пример:
this.dispatchEvent(new CustomEvent('profile-updated', {
detail: { name: 'Иван' },
bubbles: true,
composed: true
}));
В компоненте-потребителе:
<profile-card @profile-updated=${handleProfileUpdate}></profile-card>
Состояния, создаваемые через useState или
useReducer, именуются так, чтобы отражать тип и цель
хранения данных:
const [todos, setTodos] = useState([]);
const [isLoading, setIsLoading] = useState(false);
is или has для булевых
переменных.set + название состояния для функций обновления.Константы вне компонента обычно пишутся в SCREAMING_SNAKE_CASE:
const API_URL = 'https://example.com/api';
Если компонент использует слоты, их имена должны быть короткими, осмысленными и в kebab-case:
<modal-dialog>
<span slot="header">Заголовок</span>
<p slot="body">Содержимое модального окна</p>
</modal-dialog>
CamelCase, тег в
kebab-case.use,
camelCase.on<Event>.set + имя состояния, булевы
с is/has, массивы во множественном числе.Эти правила обеспечивают единообразие кода, упрощают поддержку и интеграцию компонентов в большие проекты.