SkateJS — библиотека для создания веб-компонентов на базе стандартов Custom Elements, предоставляющая удобный механизм работы с свойствами (props). Свойства компонента позволяют управлять его состоянием и взаимодействовать с внешним миром, обеспечивая реактивность и синхронизацию с DOM.
Свойства в SkateJS определяются через объект props при
создании класса компонента. Каждый ключ этого объекта описывает
отдельное свойство с его типом, поведением и значением по умолчанию.
Пример определения свойств:
import { define, props, Component } from 'skatejs';
class MyElement extends Component {
static props = {
name: props.string({ default: 'Guest' }),
age: props.number(),
active: props.boolean({ default: false })
};
render() {
return this.html`<p>${this.name}, возраст: ${this.age}, активен: ${this.active}</p>`;
}
}
define(MyElement);
Ключевые моменты:
props.string() — свойство строкового типа.props.number() — свойство числового типа.props.boolean() — логическое свойство.default — значение, используемое при отсутствии
переданного значения.Свойства компонента можно задавать через атрибуты в HTML. SkateJS
автоматически преобразует строковые значения в типы, определённые в
props.
<my-element name="Alice" age="25" active></my-element>
Особенности:
boolean) считаются
true, если атрибут присутствует, и false, если
отсутствует.Свойства компонента можно изменять программно через объект экземпляра:
const el = document.querySelector('my-element');
el.name = 'Bob';
el.age = 30;
el.active = true;
При изменении свойства:
updatedCallback для отслеживания
изменений:updatedCallback(oldProps) {
if (oldProps.name !== this.name) {
console.log(`Имя изменилось на ${this.name}`);
}
}
Свойства позволяют строить реактивные внутренние состояния, которые автоматически синхронизируются с DOM. Например, можно создавать условный рендеринг или динамическую стилизацию:
render() {
return this.html`
<div class="${this.active ? 'active' : 'inactive'}">
${this.name}, ${this.age} лет
</div>
`;
}
Изменение свойства active немедленно меняет класс
элемента и обновляет отображение.
SkateJS поддерживает объекты и массивы в качестве свойств, однако их
реактивность требует внимательного подхода. Для объектов используется
default с функцией:
static props = {
user: props.object({ default: () => ({ name: '', age: 0 }) })
};
Рекомендации:
default у
нескольких экземпляров.Свойства компонента можно связывать с событиями для двусторонней передачи данных:
class CounterElement extends Component {
static props = {
count: props.number({ default: 0 })
};
increment() {
this.count++;
this.emit('count-changed', { detail: this.count });
}
render() {
return this.html`<button @click=${() => this.increment()}>${this.count}</button>`;
}
}
emit отправляет кастомное событие.SkateJS обеспечивает двустороннюю связь между атрибутами HTML и свойствами:
el.setAttribute('age', '40'); // свойство el.age автоматически обновляется
el.name = 'Charlie'; // атрибут name в DOM обновляется
Это упрощает интеграцию веб-компонентов с обычным HTML и фреймворками, которые используют DOM-атрибуты.
default для свойств, если возможно
отсутствие значения.updatedCallback для
выполнения дорогостоящих операций только при необходимости.Свойства в SkateJS формируют основу реактивного взаимодействия
компонентов с внешним миром и внутренним состоянием. Правильная
организация props позволяет создавать гибкие, предсказуемые
и легко интегрируемые веб-компоненты, полностью соответствующие
стандартам современного фронтенда.