KeepAlive
<KeepAlive> это встроенный компонент, который позволяет условно кэшировать экземпляры компонентов при динамическом переключении между несколькими компонентами.
Базовое использование
В главе "Основы компонентов" мы представили синтаксис для Динамических компонентов, используя специальный элемент <component>:
template
<component :is="activeComponent" />По умолчанию активный экземпляр компонента будет размонтирован при переключении с него. Это приведет к потере любого измененного состояния, которое оно содержит. При повторном отображении этого компонента будет создан новый экземпляр только с начальным состоянием.
В приведенном ниже примере у нас есть два компонента с состоянием: компонент A содержит счетчик, а компонент B содержит сообщение, синхронизированное с введенным значением через v-model. Попробуйте обновить состояние одного из них, переключиться на другой компонент, а затем вернуться к нему:
Текущий компонент: A
Количество: 0Вы заметите, что при обратном переключении предыдущее измененное состояние будет сброшено.
Создание нового экземпляра компонента при переключении обычно является полезным поведением, но в этом случае нам бы очень хотелось, чтобы два экземпляра компонента сохраняли своё состояние, даже когда они неактивны. Чтобы решить эту проблему, мы можем обернуть наш динамический компонент встроенным компонентом <KeepAlive>:
template
<!-- Неактивные компоненты будут кэшироваться! -->
<KeepAlive>
<component :is="activeComponent" />
</KeepAlive>Теперь состояние будет сохраняться при переключении компонентов:
Текущий компонент: A
Количество: 0Совет
При использовании в DOM-шаблонах, на него следует ссылаться как на <keep-alive>.
Включение / Исключение
По умолчанию <KeepAlive> будет кэшировать любой экземпляр компонента внутри. Мы можем настроить это поведение с помощью параметров include и exclude. Оба свойства могут быть строками, разделенными запятыми, RegExp, или массивами, содержащими элементы типа:
template
<!-- строка, разделённая запятыми -->
<KeepAlive include="a,b">
<component :is="view" />
</KeepAlive>
<!-- регулярное выражение (используйте `v-bind`) -->
<KeepAlive :include="/a|b/">
<component :is="view" />
</KeepAlive>
<!-- массив (используйте `v-bind`) -->
<KeepAlive :include="['a', 'b']">
<component :is="view" />
</KeepAlive>Соответствие проверяется параметром name компонента, поэтому компоненты, которые должны быть условно кэшированы с помощью KeepAlive должны явно объявлять параметр name.
Совет
Начиная с версии 3.2.34, однофайловый компонент, использующий <script setup>, будет автоматически определять собственный name на основе имени файла, устраняя необходимость вручную объявлять имя.
Максимальное количество кэшированных экземпляров
Мы можем ограничить максимальное количество экземпляров компонентов, которые можно кэшировать с помощью опции max. Когда max задан, <KeepAlive> ведет себя как LRU cache: если количество закэшированных экземпляров вот-вот превысит указанное максимальное количество, то наименее недавно использованный закэшированный экземпляр будет уничтожен, чтобы освободить место для нового.
template
<KeepAlive :max="10">
<component :is="activeComponent" />
</KeepAlive>Жизненный цикл кэшированного экземпляра
Когда экземпляр компонента удаляется из DOM, но является частью дерева компонентов, кэшированного <KeepAlive>, он переходит в состояние деактивированного, вместо того, чтобы быть размонтированным. Когда экземпляр компонента вставляется в DOM как часть кэшированного дерева, он активируется.
Также наш компонент может регистрировать хуки жизненного цикла для этих двух состояний onActivated() и onDeactivated():
vue
<script setup>
import { onActivated, onDeactivated } from 'vue'
onActivated(() => {
// вызывается при первоначальном монтировании
// и каждый раз, когда он повторно вставляется из кэша
})
onDeactivated(() => {
// вызывается, когда удаляется из DOM в кэш
// и также при размонтировании
})
</script>Обратите внимание, что:
onActivatedтакже вызывается при монтировании, иonDeactivatedпри размонтировании.Оба хука работают не только с корневым компонентом, кэшированным
<KeepAlive>, но и с дочерними компонентами в кэшированном дереве.
Связанные