Функция createElement
(часто сокращенно называемая h
) - это фундаментальная часть системы рендеринга Vue. Она используется для создания виртуальных DOM-узлов (VNodes). Давайте подробно разберем ее структуру и аргументы.
createElement(
// 1. HTML-тег, компонент или асинхронный компонент (обязательный)
// 2. Объект с данными (опционально)
// 3. Дочерние элементы (опционально)
)
Может быть одним из:
'div'
, 'span'
и т.д.)Примеры:
// HTML-тег
createElement('div')
// Компонент
createElement(MyComponent)
// Асинхронный компонент
createElement(() => import('./MyAsyncComponent'))
Содержит атрибуты, свойства, обработчики событий и другие параметры:
{
// Аналоги HTML-атрибутов
attrs: {
id: 'my-id',
'data-attr': 'value'
},
// Свойства компонента
props: {
myProp: 'value'
},
// DOM-свойства
domProps: {
innerHTML: 'Текст'
},
// Стили
style: {
color: 'red',
fontSize: '14px'
},
// Классы
class: {
'active': true,
'disabled': false
},
// Обработчики событий
on: {
click: this.clickHandler,
input: this.inputHandler
},
// Нативные обработчики событий
nativeOn: {
click: this.nativeClickHandler
},
// Директивы
directives: [
{
name: 'my-directive',
value: 'someValue',
expression: 'someValue',
arg: 'arg',
modifiers: { modifier: true }
}
],
// Другие специальные поля
key: 'myKey',
ref: 'myRef',
slot: 'mySlot',
scopedSlots: { /* ... */ }
}
Может быть:
Примеры:
// Текстовый узел
createElement('div', {}, 'Простой текст')
// Массив VNodes
createElement('div', {}, [
createElement('span', 'Первый элемент'),
createElement('span', 'Второй элемент')
])
// Компактный синтаксис
createElement('div', createElement('span'))
createElement('button', {
class: 'btn btn-primary',
on: {
click: this.handleClick
}
}, 'Нажми меня')
createElement(MyList, {
props: {
items: this.items
}
}, [
createElement(MyListItem, {
props: {
item: this.items[0]
},
key: 'item-0'
}),
createElement(MyListItem, {
props: {
item: this.items[1]
},
key: 'item-1'
})
])
createElement(MyComponent, {
scopedSlots: {
default: props => createElement('span', props.text)
}
})
Vue выполняет "умное" слияние данных при наследовании компонентов:
class
и style
объединяютсяon
объединяются в массив функция createElement
принимает три основных аргумента - тип элемента, объект конфигурации и дочерние элементы. Понимание этой структуры критически важно для работы с render-функциями, JSX и созданием динамических компонентов во Vue.