Skip to content

06. Ciclo de Vida

Los hooks del ciclo de vida permiten ejecutar código en momentos específicos durante la vida de un componente. En la Composition API, estos hooks se importan desde Vue y se llaman directamente dentro de <script setup> o en la función setup().

Creación → onBeforeMount → onMounted → onBeforeUpdate → onUpdated → onBeforeUnmount → onUnmounted

Se ejecuta justo antes de que el componente se monte en el DOM.

<script setup>
import { ref, onBeforeMount } from 'vue'
const message = ref('Cargando...')
onBeforeMount(() => {
console.log('El componente está a punto de montarse')
// El DOM aún no está disponible aquí
// Ideal para configuraciones finales antes del montaje
})
</script>
<template>
<div>{{ message }}</div>
</template>

Se ejecuta después de que el componente ha sido montado en el DOM.

<script setup>
import { ref, onMounted } from 'vue'
const el = ref(null)
const message = ref('Cargando...')
onMounted(() => {
console.log('El componente ha sido montado')
console.log('Elemento referenciado:', el.value) // Ahora el DOM está disponible
message.value = 'Componente montado'
// Ideal para:
// - Acceder al DOM renderizado
// - Inicializar bibliotecas externas
// - Realizar peticiones de datos
})
</script>
<template>
<div ref="el">{{ message }}</div>
</template>

Se ejecuta justo antes de que Vue actualice el DOM debido a un cambio en el estado reactivo.

<script setup>
import { ref, onBeforeUpdate } from 'vue'
const count = ref(0)
onBeforeUpdate(() => {
console.log('El componente está a punto de actualizarse')
console.log('Valor actual en el DOM:', document.getElementById('counter').textContent)
console.log('Nuevo valor en el estado:', count.value)
// Útil para capturar el estado del DOM antes de una actualización
})
</script>
<template>
<div>
<p id="counter">{{ count }}</p>
<button @click="count++">Incrementar</button>
</div>
</template>

Se ejecuta después de que Vue ha actualizado el DOM debido a un cambio en el estado reactivo.

<script setup>
import { ref, onUpdated } from 'vue'
const count = ref(0)
onUpdated(() => {
console.log('El componente ha sido actualizado')
console.log('DOM actualizado con nuevo valor:', document.getElementById('counter').textContent)
// El DOM ya refleja el nuevo estado
})
</script>
<template>
<div>
<p id="counter">{{ count }}</p>
<button @click="count++">Incrementar</button>
</div>
</template>

Se ejecuta justo antes de que un componente sea desmontado y destruido.

<script setup>
import { onBeforeUnmount } from 'vue'
let intervalId = null
// Configurar un intervalo
intervalId = setInterval(() => {
console.log('Intervalo ejecutándose')
}, 1000)
onBeforeUnmount(() => {
console.log('El componente está a punto de desmontarse')
// Ideal para limpiar recursos que no serán recogidos automáticamente
clearInterval(intervalId) // Limpiar el intervalo antes de desmontar
})
</script>

Se ejecuta después de que el componente ha sido desmontado y destruido.

<script setup>
import { onUnmounted } from 'vue'
onUnmounted(() => {
console.log('El componente ha sido desmontado')
// El componente ya no existe en el DOM
// Todas las directivas y listeners de eventos han sido desvinculados
// Todos los componentes hijos también han sido desmontados
})
</script>
<script setup>
import { ref, onBeforeMount, onMounted, onBeforeUpdate, onUpdated, onBeforeUnmount, onUnmounted } from 'vue'
const count = ref(0)
const mounted = ref(false)
onBeforeMount(() => {
console.log('1. onBeforeMount: Componente a punto de montarse')
})
onMounted(() => {
console.log('2. onMounted: Componente montado')
mounted.value = true
})
onBeforeUpdate(() => {
console.log('3. onBeforeUpdate: Componente a punto de actualizarse')
})
onUpdated(() => {
console.log('4. onUpdated: Componente actualizado')
})
onBeforeUnmount(() => {
console.log('5. onBeforeUnmount: Componente a punto de desmontarse')
})
onUnmounted(() => {
console.log('6. onUnmounted: Componente desmontado')
})
</script>
<template>
<div>
<p>Contador: {{ count }}</p>
<button @click="count++">Incrementar</button>
<p v-if="mounted">¡Componente montado!</p>
</div>
</template>
HookMomento de ejecuciónCaso de uso común
onBeforeMountAntes de insertar el componente en el DOMConfiguración final antes del montaje
onMountedDespués de insertar el componente en el DOMAcceso al DOM, inicialización de bibliotecas, peticiones de datos
onBeforeUpdateAntes de actualizar el DOM por cambios reactivosCapturar el estado del DOM antes de una actualización
onUpdatedDespués de actualizar el DOM por cambios reactivosAcceder al DOM actualizado
onBeforeUnmountJusto antes de desmontar el componenteLimpieza de recursos (timers, event listeners)
onUnmountedDespués de desmontar el componenteConfirmación de limpieza completa
🐝