Функция рендеринга (render function) — это программная альтернатива шаблонам, которая позволяет использовать полную мощь JavaScript для описания структуры компонента на уровне Virtual DOM.
Функция рендеринга:
createElement
(обычно называемую h
)Базовый пример:
render(h) {
return h('div', { class: 'container' }, [
h('h1', 'Заголовок'),
h('p', this.message)
])
}
h
создает описания DOM-узловХарактеристика | Шаблоны | Функции рендеринга |
---|---|---|
Синтаксис | HTML-подобный | JavaScript |
Компиляция | Требуют компиляции | Не требуют компиляции |
Гибкость | Ограничена синтаксисом | Полная мощь JavaScript |
Производительность | Хорошая | Лучшая в сложных случаях |
Читаемость | Высокая | Ниже (для сложных структур) |
Пример с параметрами:
h(
'button', // Тег
{ // Объект данных
class: ['btn', { active: true }],
on: { click: this.handleClick }
},
[ // Дочерние элементы
h('span', 'Текст кнопки'),
h(Icon, { props: { name: 'right' } })
]
)
render(h) {
return h(`h${this.level}`, this.$slots.default)
}
render(h) {
return this.items.length > 0
? h('ul', this.items.map(item => h('li', item.text)))
: h('p', 'Нет элементов')
}
render(h) {
return h('div', [
this.$slots.header,
h('main', this.$slots.default),
this.$slots.footer
])
}
JSX предоставляет более читаемый синтаксис для функций рендеринга:
render() {
return (
<div class="container">
<h1>Заголовок</h1>
{this.items.map(item =>
<Item key={item.id} item={item} />
)}
</div>
)
}
Функции рендеринга позволяют:
Пример с мемоизацией:
render(h) {
// Кэшируем дочерние элементы если массив не изменился
if (!this._children || this._dirty) {
this._children = this.items.map(item => h(Item, { key: item.id }))
this._dirty = false
}
return h('div', this._children)
}
функция рендеринга — это мощный низкоуровневый API Vue для программного описания структуры компонента, который обеспечивает большую гибкость и контроль по сравнению с шаблонами, особенно полезный в сложных и высокопроизводительных сценариях.