Встроенные компоненты
Регистрация и использование
Встроенные компоненты можно использовать в шаблонах без их регистрации. Так же они являются "tree-shakeable": они включаются в сборку только тогда, когда они используются.
При использовании в render-функции, они должны быть импортированы в явном виде. Например:
js
import { h, Transition } from 'vue'
h(Transition, {
/* props */
})
<Transition>
Обеспечивает эффекты анимированного перехода одного элемента или компонента.
Входные параметры
tsinterface TransitionProps { /** * Используется для автоматической генерации CSS-классов перехода. * Например, `name: 'fade'` автоматически раскроется в `.fade-enter`, * `.fade-enter-active` и т.д. */ name?: string /** * Применять ли СSS-классы переходов. * По умолчанию: true */ css?: boolean /** * Указывает тип событий перехода, которые необходимо ждать * для определения момента окончания перехода. * По умолчанию автоматически выбирается тип с большей длительностью. */ type?: 'transition' | 'animation' /** * Определяет длительность перехода. * По умолчанию Vue ждёт первого события `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>
Динамический компонент, используются параметры mode и appear:
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
, плюс два дополнительных параметра:tsinterface TransitionGroupProps extends Omit<TransitionProps, 'mode'> { /* * Если не определен, то рендерится как fragment. */ tag?: string /** * Для переопределения CSS-класса, применяемого во время анимаций перемещения. * Используйте kebab-case в шаблонах, например move-class="xxx" */ moveClass?: string }
События
<TransitionGroup>
генерирует те же события, что и<Transition>
.Подробности
По умолчанию
<TransitionGroup>
не создаёт DOM-элемент, но его можно задать с помощью параметраtag
.Обратите внимание, что у каждого потомка
<transition-group>
должен быть уникальный ключ для правильной работы анимаций.<TransitionGroup>
поддерживает анимации перемещения с помощью CSS трансформаций. Если положение потомка на экране изменится после обновления, ему будет добавлен 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>
Кэширует содержащиеся внутри динамически переключаемые компоненты.
Входные параметры
tsinterface 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> <!-- регулярное выражение (используется `v-bind`) --> <KeepAlive :include="/a|b/"> <component :is="view"></component> </KeepAlive> <!-- массив (используется `v-bind`) --> <KeepAlive :include="['a', 'b']"> <component :is="view"></component> </KeepAlive>
Использование с
max
:template<KeepAlive :max="10"> <component :is="view"></component> </KeepAlive>
См. также Руководство — KeepAlive
<Teleport>
Перемещает содержимое своего слота в другую часть DOM.
Входные параметры
tsinterface TeleportProps { /** * Обязательный. Задаёт целевой контейнер. * Может быть селектором или непосредственно элементом. */ to: string | HTMLElement /** * Если `true`, содержимое останется на своем первоначальном * месте, вместо перемещения в целевой контейнер. * Может изменяться динамически. */ disabled?: boolean /** * When `true`, the Teleport will defer until other * parts of the application have been mounted before * resolving its target. (3.5+) */ defer?: 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>
Defer target resolution :
template<Teleport defer to="#late-div">...</Teleport> <!-- somewhere later in the template --> <div id="late-div"></div>
См. также Руководство — Teleport
<Suspense>
Используется для оркестровки вложенных асинхронных зависимостей в дереве компонентов.
Входные параметры
tsinterface SuspenseProps { timeout?: string | number suspensible?: boolean }
События
@resolve
@pending
@fallback
Подробности
<Suspense>
принимает два слота:#default
и#fallback
. Он будет отображать содержимое#fallback
слота во время рендеринга#default
слота в памяти.Если он встречает асинхронные зависимости (Асинхронные компоненты и компоненты с
async setup()
) во время рендеринга#default
слота, он будет ждать, пока все они не будут разрешены, прежде чем отобразить#default
слот.Если установить для Suspense значение
suspensible
, вся обработка асинхронных зависимостей будет выполняться родительским Suspense. См. подробности реализацииСм. также Руководство — Suspense