Skip to content

Вбудовані компоненти

Реєстрація та використання

Вбудовані компоненти можна використовувати безпосередньо в шаблонах без необхідності реєстрації. Вони також підтримують струшування дерева: вони включаються в збірку лише тоді, коли використовуються.

При їх використанні в функціях рендерингу, їх потрібно імпортувати явно. Наприклад:

js
import { h, Transition } from 'vue'  h(Transition, {  /* реквізити */ })

<Transition>

Забезпечує анімовані ефекти переходу для окремого елемента або компонента.

  • Реквізити

    ts
    interface TransitionProps {  /**  * Використовується для автоматичної генерації назв класів переходу CSS.  * напр. `name: 'fade'` буде автоматично розширено до `.fade-enter`,  * `.fade-enter-active`, тощо.  */  name?: string  /**  * Чи застосовувати класи переходу CSS.  * За промовчанням: true  */  css?: boolean  /**  * Визначає тип подій переходу, на які потрібно чекати щоб  * визначити час закінчення переходу.  * Тип за промовчанням автоматично визначає тип, який має  * більшу тривалість.  */  type?: 'transition' | 'animation'  /**  * Визначає явну тривалість переходу.  * За промовчанням чекає першої `transitionend`  * або `animationend` події на кореневому елементі переходу.  */  duration?: number | { enter: number; leave: number }  /**  * Контролює послідовність синхронізації переходів виходу/входу.  * Поведінка за промовчанням - одночасна.  */  mode?: 'in-out' | 'out-in' | 'default'  /**  * Чи застосовувати перехід під час початкового рендерингу.  * За промовчанням: false  */  appear?: boolean   /**  * Реквізити для налаштування перехідних класів.  * Використовуйте kebab-case в шаблонах, напр. enter-from-class="xxx"  */  enterFromClass?: string  enterActiveClass?: string  enterToClass?: string  appearFromClass?: string  appearActiveClass?: string  appearToClass?: string  leaveFromClass?: string  leaveActiveClass?: string  leaveToClass?: string }
  • Події

    • @before-enter
    • @before-leave
    • @enter
    • @leave
    • @appear
    • @after-enter
    • @after-leave
    • @after-appear
    • @enter-cancelled
    • @leave-cancelled (тільки для v-show)
    • @appear-cancelled
  • Приклад

    Простий елемент:

    template
    <Transition>  <div v-if="ok">вміст, що перемикається</div> </Transition>

    Примусовий перехід шляхом зміни атрибута key:

    template
    <Transition>  <div :key="text">{{ text }}</div> </Transition>

    Динамічний компонент з увімкненим режимом переходу + анімацією:

    template
    <Transition name="fade" mode="out-in" appear>  <component :is="view"></component> </Transition>

    Прослуховування перехідних подій:

    template
    <Transition @after-enter="onTransitionComplete">  <div v-show="ok">вміст, що перемикається</div> </Transition>
  • Також до вашої уваги: Гід <Transition>

<TransitionGroup>

Забезпечує ефекти переходу для декількох елементів або компонентів у списку.

  • Реквізити

    <TransitionGroup> приймає ті самі властивості, що і <Transition>, за винятком mode, а також дві додаткові властивості:

    ts
    interface TransitionGroupProps extends Omit<TransitionProps, 'mode'> {  /**  * Якщо не визначено, відрендериться як фрагмент.  */  tag?: string  /**  * Для налаштування класу CSS, застосованого під час переходів переміщення.  * Використовуйте kebab-case в шаблонах, напр. move-class="xxx"  */  moveClass?: string }
  • Події

    <TransitionGroup> випромінює ті самі події, що <Transition>.

  • Подробиці

    За промовчанням <TransitionGroup> не рендерить DOM-елемент обгортки, але його можна визначити за допомогою властивості tag.

    Зауважте, що кожен дочірній елемент у <transition-group> повинен мати унікальний ключ, щоб анімації працювали належним чином.

    <TransitionGroup> підтримує переходи з переміщеннями за допомогою CSS transform. Якщо позиція дочірнього елемента на екрані змінилася після оновлення, до нього буде застосовано CSS-клас переміщення (автоматично створений з атрибута name або налаштований за допомогою реквізиту move-class). Якщо при застосуванні CSS transform властивості можливе переміщення, елемент буде плавно анімовано до місця призначення за допомогою технології FLIP.

  • Приклад

    template
    <TransitionGroup tag="ul" name="slide">  <li v-for="item in items" :key="item.id">  {{ item.text }}  </li> </TransitionGroup>
  • Також до вашої уваги: Гід - TransitionGroup

<KeepAlive>

Кешування динамічно перемикаємих компонент, загорнутих всередину.

  • Реквізити

    ts
    interface KeepAliveProps {  /**  * Тільки компоненти з іменами, що збігаються, з  * `include` будуть кешовані.  */  include?: MatchPattern  /**  * Будь-який компонент з відповідним ім'ям з `exclude`  * не буде кешовано.  */  exclude?: MatchPattern  /**  * Максимальна кількість екземплярів компонентів для кешування.  */  max?: number | string }  type MatchPattern = string | RegExp | (string | RegExp)[]
  • Подробиці

    При обгортанні навколо динамічного компонента <KeepAlive> кешуватиме неактивні екземпляри компонентів, не знищуючи їх

    У будь-який час може бути лише один активний екземпляр компонента як прямий дочірній елемент <KeepAlive>.

    Коли компонент перемикається всередині <KeepAlive>, його хуки життєвого циклу activated та deactivated будуть викликані відповідно, надаючи альтернативу mounted і unmounted, які не викликаються. Це стосується прямого дочірнього елемента <KeepAlive>, а також усіх його нащадків.

  • Приклад

    Базове використання:

    template
    <KeepAlive>  <component :is="view"></component> </KeepAlive>

    Якщо використовується з гілками v-if / v-else, одночасно повинен відтворюватися лише один компонент:

    template
    <KeepAlive>  <comp-a v-if="a > 1"></comp-a>  <comp-b v-else></comp-b> </KeepAlive>

    Використовується разом з <Transition>:

    template
    <Transition>  <KeepAlive>  <component :is="view"></component>  </KeepAlive> </Transition>

    Використання include / exclude:

    template
    <!-- рядок, розділений комами --> <KeepAlive include="a,b">  <component :is="view"></component> </KeepAlive>  <!-- regex (використання `v-bind`) --> <KeepAlive :include="/a|b/">  <component :is="view"></component> </KeepAlive>  <!-- Array (використання `v-bind`) --> <KeepAlive :include="['a', 'b']">  <component :is="view"></component> </KeepAlive>

    Використання з max:

    template
    <KeepAlive :max="10">  <component :is="view"></component> </KeepAlive>
  • Також до вашої уваги: Гід - KeepAlive

<Teleport>

Рендеринг вмісту свого слота в іншій частині DOM.

  • Реквізити

    ts
    interface TeleportProps {  /**  * Обов'язковий вхідний реквізит. Визначиний цільовий контейнер.  * Може бути селектором або фактичним елементом.  */  to: string | HTMLElement  /**  * Якщо `true`, вміст залишиться в оригінальному вигляді  * розташування замість переміщення в цільовий контейнер.  * Можна динамічно змінювати.  */  disabled?: boolean }
  • Приклад

    Визначення цільового контейнера:

    template
    <Teleport to="#some-id" /> <Teleport to=".some-class" /> <Teleport to="[data-teleport]" />

    Умовне відключення:

    template
    <Teleport to="#popup" :disabled="displayVideoInline">  <video src="./my-movie.mp4"> </Teleport>
  • Також до вашої уваги: Гід - Teleport

<Suspense>

Використовується для управління вкладених асинхронних залежностей у дереві компонентів.

  • Реквізити

    ts
    interface SuspenseProps {  timeout?: string | number }
  • Події

    • @resolve
    • @pending
    • @fallback
  • Подробиці

    <Suspense> приймає два слоти: #default слот і #fallback слот. Він показуватиме вміст #fallback слота під час рендерингу слота за промовчанням у пам’яті.

    Якщо він зустрічає асинхронні залежності (Асинхронні компоненти й компоненти з async setup()) під час рендерингу слота за промовчанням, він чекатиме, доки всі вони будуть вирішені, перш ніж показати слот за промовчанням.

  • Також до вашої уваги: Гід - Suspense

Вбудовані компоненти has loaded