Функціональні компоненти несумісно
Огляд
З точки зору того, що змінилося, на високому рівні:
- Підвищення продуктивності від 2.x для функціональних компонентів тепер незначне у 3.x, тому ми рекомендуємо просто використовувати компоненти зі збереженням стану
- Функціональні компоненти можна створити лише за допомогою простої функції, яка отримує
propsіcontext(тобтоslots,attrs,emit) - НЕСУМІСНО: Атрибут
functionalв одно-файловому компоненті (SFC)<template>видалено - НЕСУМІСНО: Опцію
{ functional: true }у компонентах, створених функціями, видалено
Щоб дізнатися більше, читайте далі!
Вступ
У Vue 2 функціональні компоненти мали два основні варіанти використання:
- як оптимізація продуктивності, оскільки вони ініціалізуються набагато швидше, ніж компоненти зі збереженням стану
- щоб повернути кілька кореневих вузлів
Однак у Vue 3 продуктивність компонентів із збереженням стану покращилася настільки, що різниця стала незначною. Крім того, компоненти зі збереженням стану тепер також включають можливість повертати кілька кореневих вузлів.
У результаті єдиним варіантом використання функціональних компонентів є прості компоненти, такі як компонент для створення динамічного заголовка. В іншому випадку рекомендується використовувати компоненти зі збереженням стану, як зазвичай.
Синтаксис 2.x
Використовуючи компонент <dynamic-heading>, який відповідає за візуалізацію відповідного заголовка (тобто h1, h2, h3, тощо), це можна було записати як одно-файловий компонент у 2.x як:
// Приклад функціонального компонента Vue 2
export default {
functional: true,
props: ['level'],
render(h, { props, data, children }) {
return h(`h${props.level}`, data, children)
}
}Або для тих, хто надає перевагу <template> в одно-файловому компоненті:
<!-- Приклад функціонального компонента Vue 2 із <template> -->
<template functional>
<component
:is="`h${props.level}`"
v-bind="attrs"
v-on="listeners"
/>
</template>
<script>
export default {
props: ['level']
}
</script>Синтаксис 3.x
Компоненти, створені функціями
Тепер у Vue 3 усі функціональні компоненти створюються за допомогою простої функції. Іншими словами, немає необхідності визначати опцію компонента { functional: true }.
Вони отримають два аргументи: props і context. Аргумент context - це об'єкт, який містить attrs, slots і emit властивості компонента.
Крім того, замість непрямого надання h у функції render, h тепер імпортується глобально.
Ось як виглядатиме зараз згаданий вище приклад використання компонента <dynamic-heading>.
import { h } from 'vue'
const DynamicHeading = (props, context) => {
return h(`h${props.level}`, context.attrs, context.slots)
}
DynamicHeading.props = ['level']
export default DynamicHeadingОдно-файлові компоненти (SFCs)
У версії 3.x різниця в продуктивності між компонентами зі збереженням стану та функціональними компонентами була суттєво зменшена і в більшості випадків використання буде незначною. У результаті шлях міграції для розробників, які використовують functional на SFCs, полягає у видаленні атрибута та перейменуванні всіх посилань props на $props і attrs на $attrs.
Використовуючи наш попередній приклад <dynamic-heading>, ось як це виглядатиме зараз.
<template>
<component
v-bind:is="`h${$props.level}`"
v-bind="$attrs"
/>
</template>
<script>
export default {
props: ['level']
}
</script>Основні відмінності полягають у тому, що:
- атрибут
functionalвилучено з<template> listenersтепер передаються як частина$attrsі їх можна видалити
Наступні кроки
Щоб отримати додаткові відомості про використання нових функціональних компонентів і зміни функцій рендерингу в цілому, дивіться: