Render Props — это паттерн в SkateJS, позволяющий компонентам делегировать управление рендерингом их внутреннего состояния внешним функциям. В отличие от стандартных шаблонов, где структура HTML фиксирована внутри компонента, Render Props предоставляют гибкость для динамического формирования разметки.
Render Props реализуются через передачу функции в качестве свойства
компонента. Эта функция вызывается внутри компонента с набором данных
или методов, которые определяют текущее состояние. В SkateJS такой
подход тесно интегрирован с реактивными свойствами (props)
и жизненным циклом компонентов.
Пример базового компонента с Render Props:
import { Component, h, Prop } from 'skatejs';
class Counter extends Component {
@Prop count = 0;
static get is() { return 'my-counter'; }
increment() {
this.count++;
}
renderCallback() {
return this.render({ count: this.count, increment: () => this.increment() });
}
render({ count, increment }) {
if (typeof this.props.children === 'function') {
return this.props.children({ count, increment });
}
return <div>{count}</div>;
}
}
customElements.define(Counter.is, Counter);
Здесь ключевые моменты:
props.children проверяется на функцию. Если это
функция, она вызывается с объектом состояния (count) и
метода (increment).renderCallback отвечает за вызов
render при изменении состояния.<my-counter>
{({ count, increment }) => (
<div>
<p>Текущее значение: {count}</p>
<button onCl ick={increment}>Увеличить</button>
</div>
)}
</my-counter>
В данном примере компонент my-counter не знает о
конкретной разметке, а делегирует это функции внутри
children. Это обеспечивает максимальную гибкость и
повторное использование компонентов.
Render Props в SkateJS обычно передают следующие данные:
state или
props) — значения, которые могут динамически
изменяться.increment,
toggle, submit.Важно, чтобы Render Props были чистыми функциями, не вызывающими побочных эффектов вне компонента, чтобы сохранить реактивность и предсказуемость поведения.
SkateJS позволяет использовать Render Props для условного рендеринга. Например, можно передавать разные функции для разных состояний:
<my-counter>
{({ count, increment }) =>
count % 2 === 0
? <div>Четное: {count}</div>
: <div>Нечетное: {count} <button onCl ick={increment}>+</button></div>
}
</my-counter>
Такой подход делает компоненты полностью конфигурируемыми без изменения их внутренней логики.
Render Props тесно интегрируются с реактивной системой SkateJS:
Prop) автоматически вызывает
renderCallback, что обновляет разметку.shouldUpdate для оптимизации,
предотвращая обновление, если переданные данные не изменились.Render Props легко комбинируются с событиями компонента и жизненным циклом SkateJS:
updatedCallback позволяет точно
контролировать, когда Render Props вызываются при изменении данных.Render Props в SkateJS превращают компоненты в высокоадаптивные строительные блоки, позволяя создавать сложные интерфейсы с минимальной жесткой привязкой к структуре.