Вам может быть интересно, с какой стати я должен использовать функцию рендеринга. Теперь представьте, что вам нужно отображать различные типы тегов H на основе значения свойства. Посмотрите, как это может выглядеть...

<!-- App.vue -->
<script setup>
import DynamicHeading from '../components/DynamicHeading.vue';
</script>

<template>
    <DynamicHeading :importance="2" />
</template>
<!-- DynamicHeading.vue -->

<script setup>
const props = defineProps({
    importance: {
        type: Number,
        default: 1
    },
})
</script>

<template>
    <div>
        <h1 v-if="importance == 1">This is title.</h1>
        <h2 v-if="importance == 2">This is title.</h2>
        <h3 v-if="importance == 3">This is title.</h3>
        <h4 v-if="importance == 4">This is title.</h4>
        <h5 v-if="importance == 5">This is title.</h5>
        <h6 v-if="importance == 6">This is title.</h6>
    </div>
</template>

Становится грязно, да? Вот тут-то и появляется функция рендеринга.
Сначала вам нужно ее импортировать.

import { h } from 'vue'

h() помогает создавать гипертекст. Однако при использовании функций рендеринга мы можем напрямую возвращать функцию рендеринга. Он очень гибкий в использовании. Используя его мощь, мы перепишем компонент DynamicHeading.vue.

<!-- DynamicHeading.vue -->
<script>
import { h } from 'vue'

export default {
    props: {
        importance: {
            type: Number,
            default: 1
        },
    },

    setup(props) {
        return () => h(`h${props.importance}`, 'This is title')   
    }
}

</script>

Видите ли, внутри функции рендеринга первый аргумент — это имя тега, а второй — содержимое. Отсутствует тег template, все операторы if убраны. Поскольку функция рендеринга находится внутри setup(), она может получить доступ к реквизитам.

Это даст вам полную власть над компонентом. Вот несколько примеров из Vue doc.

// all arguments except the type are optional
h('div')
h('div', { id: 'foo' })

// both attributes and properties can be used in props
// Vue automatically picks the right way to assign it
h('div', { class: 'bar', innerHTML: 'hello' })

// props modifiers such as `.prop` and `.attr` can be added
// with `.` and `^` prefixes respectively
h('div', { '.name': 'some-name', '^width': '100' })

// class and style have the same object / array
// value support that they have in templates
h('div', { class: [foo, { bar }], style: { color: 'red' } })

// event listeners should be passed as onXxx
h('div', { onClick: () => {} })

// children can be a string
h('div', { id: 'foo' }, 'hello')

// props can be omitted when there are no props
h('div', 'hello')
h('div', [h('span', 'hello')])

// children array can contain mixed vnodes and strings
h('div', ['hello', h('span', 'hello')])

Не забудьте проверить документ api.

Однако важно отметить, что функции рендеринга следует использовать только при необходимости. В большинстве случаев для достижения тех же результатов можно использовать шаблоны. Шаблоны легче читать и поддерживать, и они могут быть такими же мощными, как и функции рендеринга.

Вот несколько примеров, когда вы можете захотеть использовать функцию рендеринга:

  • Когда вам нужно сделать много вычислений или условной логики.
  • Когда вам нужно получить доступ или манипулировать данными, переданными вашему компоненту.
  • Когда вам нужно создать пользовательские директивы.
  • Когда вам нужно реализовать сложную логику, которую было бы сложно или невозможно сделать с помощью шаблона.

Надеюсь, вам понравился этот урок. Спасибо за чтение.