Diferencias Clave entre los Hooks created y mounted en Vue.js

Comprendiendo los Hooks de Ciclo de Vida en Vue.js

Cuando se trabaja con Vue.js, comprender el ciclo de vida de una instancia o componente es fundamental para desarrollar aplicaciones robustas y eficientes. Estos ciclos, definidos por una serie de "hooks" o ganchos, nos permiten ejecutar código en momentos específicos de la vida de un componente, desde su creación hasta su destrucción. Dos de los hooks más preguntados y utilizados son created y mounted.

El Ciclo de Vida de una Instancia Vue

Cada instancia de Vue atraviesa una serie de etapas de inicialización: configuración de reactividad de datos, compilación de plantillas, montaje en el DOM y actualización cuando los datos cambian. Durante este proceso, se invocan los hooks de ciclo de vida, brindando puntos de inserción para nuestra lógica personalizada.

Por ejemplo, el hook created se ejecuta justo después de que la instancia ha sido creada:


new Vue({
  data: {
    userMessage: 'Hola, mundo desde Vue!'
  },
  created() {
    // 'this' apunta a la instancia vm
    console.log('Mensaje de usuario inicial:', this.userMessage);
  }
});
// Salida en consola: "Mensaje de usuario inicial: Hola, mundo desde Vue!"

Existen otros hooks como mounted, updated y destroyed, cada uno invocándose en diferentes fases del ciclo de vida. Es crucial recordar que, dentro de estos hooks, el contexto this siempre se refiere a la instancia de Vue que lo invoca.

Fundamentos del Proceso de Renderizado del Navegador

Para entender a fondo los hooks de Vue, es útil revisar cómo un navegador procesa y renderiza una página web. Este conocimiento nos ayuda a comprender por qué ciertos recursos están disponibles o no en distintas fases del ciclo de vida de Vue.

El proceso de renderizado básico de un navegador incluye:

  1. Construcción del Árbol DOM: El navegador analiza el HTML para crear el Modelo de Objeto del Documento.
  2. Construcción del Árbol CSSOM: El navegador analiza el CSS para crear el Modelo de Objeto CSS.
  3. Ejecución de Scripts JS: Los archivos JavaScript se cargan y ejecutan, pudiendo modificar el DOM o CSSOM.
  4. Formación del Árbol de Renderización: Se combinan el DOM y el CSSOM para crear una estructura que contiene solo los elementos visibles y sus estilos calculados.
  5. Cálculo del Diseño (Layout): El navegador calcula la geometría (posición y tamaño) de cada elemento en el árbol de renderización.
  6. Pintado (Painting): Los píxeles son dibujados en la pantalla, basándose en el diseño y los estilos calculados.

Explorando los Hooks de Ciclo de Vida y la Disponibilidad del DOM

Veamos cómo se comportan los datos, los métodos y la disponibilidad del DOM en los primeros hooks del ciclo de vida de Vue. Considere el siguiente fragmento HTML:


<div id="myVueApp">
  <p id="dataDisplayElement">{{ applicationMessage }}</p>
</div>

Y la siguiente instancia de Vue:


new Vue({
  el: '#myVueApp',
  data: {
    applicationMessage: 'Contenido dinámico de la aplicación.'
  },
  methods: {
    performAction() {
      console.log('Método ejecutado. Mensaje actual:', this.applicationMessage);
    }
  },
  beforeCreate() {
    console.log('--- beforeCreate Hook ---');
    console.log('Acceso a elemento DOM (dataDisplayElement):', document.getElementById('dataDisplayElement')); // null
    console.log('Acceso a datos (applicationMessage):', this.applicationMessage); // undefined
    // this.performAction(); // Error: this.performAction is not a function
  },
  created() {
    console.log('--- created Hook ---');
    console.log('Acceso a elemento DOM (dataDisplayElement):', document.getElementById('dataDisplayElement')); // null
    console.log('Acceso a datos (applicationMessage):', this.applicationMessage); // "Contenido dinámico de la aplicación."
    this.performAction(); // "Método ejecutado. Mensaje actual: Contenido dinámico de la aplicación."
  },
  beforeMount() {
    console.log('--- beforeMount Hook ---');
    console.log('Acceso a elemento DOM (dataDisplayElement):', document.getElementById('dataDisplayElement')); // null
    console.log('Acceso a datos (applicationMessage):', this.applicationMessage); // "Contenido dinámico de la aplicación."
    this.performAction(); // "Método ejecutado. Mensaje actual: Contenido dinámico de la aplicación."
  },
  mounted() {
    console.log('--- mounted Hook ---');
    console.log('Acceso a elemento DOM (dataDisplayElement):', document.getElementById('dataDisplayElement')); // <p id="dataDisplayElement">...</p>
    console.log('Acceso a datos (applicationMessage):', this.applicationMessage); // "Contenido dinámico de la aplicación."
    this.performAction(); // "Método ejecutado. Mensaje actual: Contenido dinámico de la aplicación."
  }
});

Tabla Resumen de Disponibilidad de Recursos

Basándonos en las observaciones del ejemplo anterior, podemos resumir la disponibilidad de los recursos de la siguiente manera:

Hook del Ciclo de Vida Acceso al DOM (Elementos montados) Acceso a Propiedades data Acceso a methods
beforeCreate No No No
created No
beforeMount No
mounted

Explicación Detallada de los Hooks

beforeCreate

En esta etapa inicial, la instancia de Vue aún no ha sido inicializada por completo. Los observadores de datos y el sistema de reactividad de Vue no están configurados. Por lo tanto, no se puede acceder a las propiedades reactivas (data) ni a los métodos definidos en la instancia. El DOM externo tampoco está disponible ni el $el de la instancia.

created

Una vez que la instancia de Vue ha sido creada, los observadores de datos ya están activos y se han inyectado las propiedades reactivas (data) y los métodos. Esto significa que ya podemos acceder y manipular this.data y this.methods. Sin embargo, la plantilla aún no se ha compilado ni montado en el DOM real del navegador. El $el de la instancia sigue siendo undefined. Por esta razón, cualquier intento de acceder a elementos del DOM relacionados con la plantilla de Vue (como document.getElementById('dataDisplayElement')) resultará en null. Este es un buen momento para realizar llamadas a APIs para cargar datos iniciales, ya que la reactividad ya funciona.

beforeMount

Esta fase ocurre justo antes de que la plantilla compilada de Vue sea montada en el DOM. Similar a created, los datos y métodos están disponibles y funcionales. La diferencia principal es que Vue ha terminado de compilar la plantilla en una función de renedrizado y está a punto de reemplazar el elemento $el original (el que especificamos en la opción el) con el contenido renderizado por la instancia. Aunque la plantilla está lista internamente, aún no se ha insertado en el DOM visible del navegador, por lo que el acceso directo al DOM de la plantilla aún no es posible.

mounted

Este es el punto donde la instancia de Vue ha completado la fase de montaje. La plantilla ha sido compilada, renderizada e insertada en el DOM real del navegador. El $el de la instancia ahora contiene el elemento DOM resultante, y podemos interactuar con él directamente. Por lo tanto, el hook mounted es el lugar ideal para realizar manipulaciones directas del DOM, integrar bibliotecas de terceros que requieran un DOM existente (como bibliotecas de gráficos), o realizar cualquier operación que necesite que el componente esté visible y accesible en la página.

Etiquetas: vue.js Lifecycle Hooks Frontend Development JavaScript Frameworks Component Lifecycle

Publicado el 7-30 14:41