Перевод статьи Sarah Drasner: What does the ‘h’ stand for in Vue’s render method?. Опубликовано с разрешения автора.
Если вы когда-либо работали с фреймворком Vue.js, то вам приходилось сталкиваться в файле main.js
с подобным способом рендеринга приложения:
new Vue({
render: h => h(App)
}).$mount('#app')
В последней версии консольной утилиты vue-cli такой способ является способом по умолчанию.
Другим возможным случаем, когда вам приходилось сталкиваться с функцией рендеринга render()
, является использование синтаксического расширения JSX в локальном компоненте Vue-приложения:
Vue.component('jsx-example', {
render (h) {
return <div id="foo">bar</div>
}
})
В обоих случаях у вас мог возникнуть вопрос - что такое h
и для чего оно предназначено?
Если кратко - h
является сокращением от hyperscript. Это название является (в свою очередь) сокращением для Hypertext Markup Language. Такое имя используется потому, что при работе с Vue-приложением мы фактически имеем дело со скриптом, результатом работы которого является виртуальное DOM-дерево. Использование подобного сокращения также встречается в официальной документации других JavaScript-фреймворков. Например, в документации Cycle.js есть определение h
- The hyperscript function h().
Из официальной документации Vue.js:
Сокращение createElement до h — распространённое соглашение в экосистеме Vue и обязательное для использования JSX. В случае отсутствия h в области видимости, приложение выбросит ошибку.
В одном из ишью создатель фреймворка Vue.js Эван Ю (Evan You) так объясняет, что такое h
:
Термин hyperscript можно объяснить так - это "скрипт, который генерирует HTML-структуру"
Сокращение h
используется при написании кода - так быстрее и легче. Более подробно это сокращение также объясняется Эваном в Advanced Vue Workshop - курсов для фронтенд-разработчиков Frontend Masters.
Про сокращение h
можно думать как о более краткой форме функции createElement
. Например, полная форма функции createElement
представлена ниже:
render: function (createElement) {
return createElement(App);
}
Если заменить createElement
на h
, то получим более сокращенный вариант этой функции:
render: function (h) {
return h(App);
}
... который можно сократить еще больше при помощи возможностей ES6:
render: h => h (App)
Vue-версия функции render()
принимает три аргумента:
render(h) {
return h('div', {}, [...])
}
- первый аргумент - это тип элемента (в примере представлен
div
); - второй аргумент - это объект данных (здесь можно передать свойства, атрибуты, классы или стили);
- третий аргумент - это массив дочерних Node-узлов; здесь можно размещать вложенные вызовы функции
createElement
и вернуть обратно дерево виртуальных DOM-узлов;
Термин hyperscript может вводить в заблуждение в некоторых случаях, так как это имя JavaScript-библиотеки hyperscript, у которой есть одноименная экосистема. В нашем конкретном случае речь не идет об этих сущностях.
Надеюсь, статья оказалась полезной для тех читателей, которые задавались подобным вопросом.