Може би се чудите защо, за бога, бих използвал функция за рендиране. Сега си представете, че трябва да изобразите различни типове 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“ са изчезнали. Тъй като функцията render е в 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 документа.
Въпреки това е важно да се отбележи, че функциите за изобразяване трябва да се използват само когато е необходимо. В повечето случаи можете да използвате шаблони, за да постигнете същите резултати. Шаблоните са по-лесни за четене и поддръжка и могат да бъдат също толкова мощни, колкото и функциите за изобразяване.
Ето някои примери за това, когато може да искате да използвате функция за изобразяване:
- Когато трябва да направите много изчисления или условна логика.
- Когато имате нужда от достъп или манипулиране на данните, предадени на вашия компонент.
- Когато трябва да създадете персонализирани директиви.
- Когато трябва да внедрите сложна логика, която би било трудно или невъзможно да се направи с шаблон.
Надявам се, че този урок ви е харесал. Благодаря ви, че прочетохте.