Skip to content

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>

Также наш компонент может регистрировать хуки жизненного цикла для этих двух состояний activated и deactivated хуки:

js
export default {  activated() {  // вызывается при первоначальном монтировании  // и каждый раз, когда он повторно вставляется из кэша  },  deactivated() {  // вызывается, когда удаляется из DOM в кэш  // и также при размонтировании  } }

Обратите внимание, что:

  • onActivatedactivated также вызывается при монтировании, и onDeactivateddeactivated при размонтировании.

  • Оба хука работают не только с корневым компонентом, кэшированным <KeepAlive>, но и с дочерними компонентами в кэшированном дереве.


Связанные

KeepAliveУже загружено