Skip to content

KeepAlive

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

Основне використання

У розділі «Основи компонентів» ми представили синтаксис для динамічних компонентів, використовуючи спеціальний елемент <component>:

template
<component :is="activeComponent" />

За промовчанням екземпляр активного компонента буде демонтовано, якщо його вимкнути. Це призведе до втрати будь-якого зміненого стану. Коли цей компонент буде показано знову, буде створено новий екземпляр лише з початковим станом.

У наведеному нижче прикладі ми маємо два компоненти зі збереженням стану: A містить лічильник, а Б містить повідомлення, синхронізоване з введенням через v-model. Спробуйте оновити стан одного з них, вимкніться, а потім поверніться до нього:

Компонент: A

Рахунок: 0

Ви помітите, що після перемикання назад попередній змінений стан було б скинуто.

Створення нового екземпляра компонента є корисною поведінкою, але в цьому випадку ми дійсно хотіли б, щоб два екземпляри компонента зберігалися, навіть якщо вони неактивні. Щоб вирішити цю проблему, ми можемо обернути наш динамічний компонент вбудованим компонентом <KeepAlive>:

template
<!-- Неактивні компоненти будуть кешовані! -->
<KeepAlive>
  <component :is="activeComponent" />
</KeepAlive>

Тепер стан буде збережено для компонентів:

Компонент: A

Рахунок: 0

TIP

У разі використання в шаблонах 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.

TIP

Починаючи з версії 3.2.34, однофайловий компонент, який використовує <script setup>, автоматично визначатиме свій параметр name на основі назви файлу, усуваючи необхідність вручну оголошувати назву.

Максимальна кількість кешованих екземплярів

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

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 has loaded