nuxt

20 jan 2025

O que é o KeepAlive e como utilizá-lo

O KeepAlive é uma funcionalidade feita para otimizar o desempenho preservando o estado de componentes e evitando sua recriação durante as navegações.

Ao utilizar o KeepAlive, o Vue mantém os componentes em memória, preservando seu estado. Isso significa que, em vez de desmontar o componente, ele é pausado (ciclo onDeactivated). Quando o usuário retorna ao componente, ele é reativado exatamente como estava antes (ciclo onActivated).

Um exemplo comum de uso é entre troca de abas dinâmicas. O KeepAlive pode ser aplicado para evitar a perda de estado ao alternar entre elas.

No código abaixo, tanto a aba selecionada quando o conteúdo da aba é mantido em memória. Assim, qualquer estado dentro do componente é preservado.

<!-- pages/index.vue -->

<script setup lang="ts">
const TabA = resolveComponent("TabA")
const TabB = resolveComponent("TabB")

const components = [
  { name: "TabA", component: TabA },
  { name: "TabB", component: TabB },
]

const selectedComponent = ref("TabA")

const componentToRender: Component | undefined = computed(() => {
  const toRender = components.find((i) => i.name === selectedComponent.value)
  return toRender?.component
})
</script>

<template>
  <div>
    <button @click="() => (selectedComponent = 'TabA')">Tab A</button>
    <button @click="() => (selectedComponent = 'TabB')">Tab B</button>

    <KeepAlive>
      <Component :is="componentToRender" />
    </KeepAlive>
  </div>
</template>

Trouxe o código feito em Nuxt de forma proposital. Aqui, seguindo a documentação, precisamos de uma configuração extra: dentro de app.vue, precisamos definir quais páginas queremos incluir ou excluir, passando como props ao NuxtPage.

<!-- app.vue  -->
<NuxtPage :keepalive="{ include: 'index' }" />

Lembrando que essas opções também existem no Vue, porém não é necessário configurar. Confere aqui na documentação.

O uso do KeepAlive deve ser estratégico, priorizando componentes cuja recriação frequente impactaria o desempenho da aplicação. Em caso de uso excessivo, ele pode causar problemas de performance.