В SkateJS различие между controlled и uncontrolled компонентами является ключевым при управлении состоянием элементов пользовательского интерфейса. Оно напрямую влияет на то, как данные передаются и обновляются, а также на реактивность компонентов.
Uncontrolled компоненты — это элементы, которые самостоятельно управляют своим внутренним состоянием без прямого вмешательства извне. В SkateJS это реализуется через локальные свойства и внутренние механизмы обновления.
Пример:
import { define, Component, h, prop } from 'skatejs';
class UncontrolledInput extends Component {
static props = {
value: prop.string()
};
constructor() {
super();
this.value = '';
}
renderCallback() {
return h('input', {
value: this.value,
onInput: (event) => {
this.value = event.target.value;
}
});
}
}
define('uncontrolled-input', UncontrolledInput);
Особенности:
value обновляется локально при событии
input.Недостатки:
Controlled компоненты полностью управляются извне. Значение любого свойства задаётся через пропсы, а любые изменения состояния передаются родителю для обработки.
Пример:
import { define, Component, h, prop } from 'skatejs';
class ControlledInput extends Component {
static props = {
value: prop.string(),
onChange: prop.func()
};
renderCallback() {
return h('input', {
value: this.value || '',
onInput: (event) => {
this.onChange && this.onChange(event.target.value);
}
});
}
}
define('controlled-input', ControlledInput);
Особенности:
value передаётся через пропсы.onChange, которая позволяет родителю решать, нужно
ли обновлять значение.Недостатки:
| Характеристика | Uncontrolled | Controlled |
|---|---|---|
| Место хранения состояния | Внутри компонента | В родительском компоненте |
| Способ обновления | Локальные события (onInput, onChange) |
Колбэки для передачи изменений наружу |
| Сложность | Ниже | Выше |
| Интеграция с глобальным состоянием | Ограничена | Полная |
| Предсказуемость поведения | Частично | Полная |
value для
внешнего контроля при необходимости.prop — основной способ определения
реактивных свойств, которые автоматически вызывают ререндер при
изменении.renderCallback — функция, вызываемая
при изменении любого реактивного свойства.class MixedInput extends Component {
static props = {
value: prop.string(),
defaultValue: prop.string(),
onChange: prop.func()
};
constructor() {
super();
this.value = this.value || this.defaultValue || '';
}
renderCallback() {
return h('input', {
value: this.value,
onInput: (event) => {
const newValue = event.target.value;
if (this.onChange) {
this.onChange(newValue); // controlled
} else {
this.value = newValue; // uncontrolled fallback
}
}
});
}
}
define('mixed-input', MixedInput);
Такой подход позволяет компоненту работать как
uncontrolled, если родитель не передаёт
value, и как controlled, если
передаётся.
Controlled и uncontrolled — фундаментальное различие в архитектуре SkateJS-компонентов, которое напрямую влияет на реактивность, интеграцию с формами и управляемость приложения. Понимание этих концепций позволяет создавать гибкие и предсказуемые интерфейсы.