Skip to content

KeepAlive

<KeepAlive> je vestavěná komponenta, která nám umožňuje podmíněně ukládat instance komponent do cache při dynamickém přepínání mezi více komponentami.

Základní použití

V kapitole Základy komponent jsme představili syntaxi pro Dynamické komponenty s použitím speciálního elementu <component>:

template
<component :is="activeComponent" />

Ve výchozím nastavení bude instance aktivní komponenty odpojena (unmounted), když se z ní přesunete jinam. To způsobí ztrátu jakýchkoli změn stavu, které si drží. Když se tato komponenta znovu zobrazí, vytvoří se nová instance čistě ve výchozím stavu.

V příkladu níže máme dvě stavové komponenty – A obsahuje počítadlo, zatímco B obsahuje zprávu synchronizovanou s uživatelským vstupem přes v-model. Zkuste aktualizovat stav jedné z nich, přepněte na druhou a poté se do ní přepněte zpátky:

Aktuální komponenta: A

Počet: 0

Uvidíte, že po přepnutí zpět byl předchozí změněný stav resetován.

Vytváření nové instance komponenty po přepnutí je normálně užitečné chování, ale v tomto případě bychom opravdu rádi, aby byly tyto dvě instance komponent zachovány, i když jsou neaktivní. Abychom tento problém vyřešili, můžeme naši dynamickou komponentu zabalit do vestavěné komponenty <KeepAlive>:

template
<!-- neaktivní komponenty budou umístěny do cache -->
<KeepAlive>
  <component :is="activeComponent" />
</KeepAlive>

Nyní bude mezi přepínámím komponent stav zachován:

Aktuální komponenta: A

Počet: 0

TIP

Při použití v in-DOM šablonách by měl být použit zápis <keep-alive>.

Include / Exclude

Ve výchozím nastavení <KeepAlive> bude do cache umisťovat každou komponentu uvnitř. Můžeme toto chování upravit pomocí vlastností (props) include a exclude. Obě vlastnosti mohou být řetězce oddělené čárkami, regulární výraz nebo pole obsahující libovolné hodnoty obou typů:

template
<!-- řetězce oddělené čárkami -->
<KeepAlive include="a,b">
  <component :is="view" />
</KeepAlive>

<!-- regex (použijte `v-bind`) -->
<KeepAlive :include="/a|b/">
  <component :is="view" />
</KeepAlive>

<!-- pole (použijte `v-bind`) -->
<KeepAlive :include="['a', 'b']">
  <component :is="view" />
</KeepAlive>

Shoda je porovnávána s atributem name komponenty, takže ty, které je třeba podmíněně uložit do cache pomocí KeepAlive, musí atribut name explicitně deklarovat.

TIP

Od verze 3.2.34 odvodí Single-File komponenta (SFC) používající <script setup> svou vlastnost name automaticky na základě názvu souboru, čímž nutnost deklarovat jméno ručně odpadá.

Maximální počet cached instancí

Můžeme omezit maximální počet instancí komponent, které lze uložit do cache pomocí vlastnosti max. Když je zadáno max, <KeepAlive> se chová jako LRU cache: pokud by měl počet instancí uložených v cache překročit zadaný maximální počet, bude nejdéle nepoužívaná instance v cache zničena, aby se pro novou uvolnilo místo.

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

Životní cyklus cached instance

Když je instance komponenty odstraněna z DOM, ale je součástí stromu komponent uloženého v cache prostřednictvím <KeepAlive>, přejde místo unmounted do stavu deactivated. Když je instance komponenty vložena do DOM jako součást stromu komponent uloženého v cache, stane se activated.

„Kept-alive“ komponenta může registrovat lifecycle hooks pro tyto dva stavy pomocí onActivated() a onDeactivated():

vue
<script setup>
import { onActivated, onDeactivated } from 'vue'

onActivated(() => {
  // zavolá se při úvodním připojení (mounted)
  // a pokaždé, když je komponenta znvou vložena z cache
})

onDeactivated(() => {
  // zavolá se při odebrání z DOM a uložení do cache
  // a také při odpojení (unmounted)
})
</script>

"Kept-alive" komponenta může registrovat lifecycle hooks pro tyto dva stavy pomocí sekcí activated a deactivated:

js
export default {
  activated() {
    // zavolá se při úvodním připojení (mounted)
    // a pokaždé, když je komponenta znvou vložena z cache
  },
  deactivated() {
    // zavolá se při odebrání z DOM a uložení do cache
    // a také při odpojení (unmounted)
  }
}

Pamatujte, že:

  • onActivatedactivated se také volá při úvodním připojení (mounted), a onDeactivateddeactivated při závěrečném odpojení (unmounted).

  • Oba lifecycle hooks fungují nejen pro root komponentu uloženou v cache <KeepAlive>, ale také pro komponenty potomků v uloženém stromu komponent.


Související

KeepAlive has loaded