Перейти к содержанию

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>.

Include / Exclude ​

По умолчанию <KeepAlive> будет кэшировать любой экземпляр компонента внутри. Мы можем настроить это поведение с помощью атрибутов include и exclude. Оба атрибута могут представлять собой строку, разделённую запятыми, RegExp или массив, содержащий любой из этих типов:

template
<!-- строка, разделённая запятыми -->
<KeepAlive include="a,b">
  <component :is="view" />
</KeepAlive>

<!-- regex (используем `v-bind`) -->
<KeepAlive :include="/a|b/">
  <component :is="view" />
</KeepAlive>

<!-- Array (используем `v-bind`) -->
<KeepAlive :include="['a', 'b']">
  <component :is="view" />
</KeepAlive>

Соответствие проверяется по опции name компонента, поэтому компоненты, которым необходимо условное кэширование с помощью KeepAlive, должны явно объявить опцию name.

Совет

Начиная с версии 3.2.34, однофайловый компонент, использующий <script setup>, будет автоматически определять опцию name на основе имени файла, избавляя вас от необходимости вручную объявлять имя.

Максимальное количество кэшированных экземпляров ​

Мы можем ограничить максимальное количество экземпляров компонентов, которые могут быть кэшированы, с помощью параметра max. Если указано max, <KeepAlive> ведет себя как LRU-кэш: Если количество кэшированных экземпляров превысит указанное максимальное количество, то наименее часто используемый кэшированный экземпляр будет уничтожен, чтобы освободить место для нового.

template
<KeepAlive :max="10">
  <component :is="activeComponent" />
</KeepAlive>

Жизненный цикл кэшированного экземпляра ​

Когда экземпляр компонента удаляется из DOM, но является частью дерева компонентов, кэшируемого <KeepAlive>, он переходит в состояние deactivated вместо того, чтобы быть размонтированным. Когда экземпляр компонента вставляется в 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