Ilustración abstracta con logo de React

React es una de las bibliotecas más populares para construir interfaces de usuario en aplicaciones web modernas. Uno de los conceptos fundamentales en React es el ciclo de vida de los componentes, que describe las etapas por las que pasa un componente desde su creación hasta su eliminación del DOM. Comprender estas etapas es crucial para manejar efectos secundarios, optimizar el rendimiento y mantener un código limpio.

En este artículo, exploraremos las tres fases principales del ciclo de vida de un componente en React: montajeactualización y desmontaje.

Ciclo de vida de un componente React

1. Fase de Montaje

La fase de montaje es la etapa en la que un componente se crea y se inserta en el DOM. Durante esta fase, se ejecutan varios métodos clave que permiten inicializar el estado, configurar el componente y realizar operaciones después de que el componente esté presente en el DOM.

Métodos Principales:

constructor(props)

El método constructor es el primer método que se ejecuta cuando se crea una instancia de un componente. Aquí se inicializa el estado y se enlazan los métodos que se utilizarán en el componente, es decir, imagina que estás preparando una receta. El constructor sería como preparar todos los ingredientes antes de empezar a cocinar.

 
class MiComponente extends React.Component {
  constructor(props) {
    super(props);
    this.state = { contador: 0 };
    this.incrementar = this.incrementar.bind(this);
  }

  incrementar() {
    this.setState({ contador: this.state.contador + 1 });
  }

  render() {
    return (
      <div>
        <p>Contador: {this.state.contador}</p>
        <button onClick={this.incrementar}>Incrementar</button>
      </div>
    );
  }
}

render()

El método render es obligatorio en todos los componentes de clase. Define la estructura visual del componente y se ejecuta cada vez que el componente necesita ser mostrado o actualizado, es decir, es como armar un mueble siguiendo las instrucciones. El render es el paso donde ensamblas todas las piezas para que el mueble esté listo.

 
render() {
  return (
    <div>
      <p>Contador: {this.state.contador}</p>
      <button onClick={this.incrementar}>Incrementar</button>
    </div>
  );
}

componentDidMount()

Este método se ejecuta inmediatamente después de que el componente se haya montado en el DOM. Es ideal para realizar operaciones que requieran que el componente esté presente, como solicitudes de datos o configuraciones de suscripciones. Es decir después de montar el mueble, decides decorarlo con algunos adornos. componentDidMount es el momento en que añades esos detalles finales.

 
componentDidMount() {
  fetch('https://api.example.com/datos')
    .then(response => response.json())
    .then(data => this.setState({ datos: data }));
}

2. Fase de Actualización

La fase de actualización ocurre cuando las propiedades (props) o el estado (state) del componente cambian, lo que provoca una re-renderización. Durante esta fase, React ofrece métodos para controlar si el componente debe actualizarse y para realizar operaciones después de la actualización.

Métodos Principales:

shouldComponentUpdate(nextProps, nextState)

Este método permite determinar si el componente debe actualizarse o no. Por defecto, devuelve true, pero puedes sobrescribirlo para optimizar el rendimiento y evitar re-renderizaciones innecesarias. Por Ejemplo, imagina que tienes una lista de tareas. Antes de actualizar la lista, verificas si realmente hay cambios. Si no los hay, no pierdes tiempo en reorganizarla.

 
shouldComponentUpdate(nextProps, nextState) {
  return nextState.contador !== this.state.contador;
}

componentDidUpdate(prevProps, prevState)

Este método se invoca inmediatamente después de que el componente se haya actualizado. Es útil para realizar operaciones en el DOM o hacer solicitudes adicionales basadas en los cambios. Por ejemplo, después de actualizar tu lista de tareas, decides enviar un correo electrónico con las tareas pendientes. componentDidUpdate es el momento en que realizas esa acción.

 
componentDidUpdate(prevProps, prevState) {
  if (prevState.contador !== this.state.contador) {
    console.log('El contador ha cambiado:', this.state.contador);
  }
}

3. Fase de Desmontaje

La fase de desmontaje ocurre cuando el componente se elimina del DOM. Aquí se ejecuta un método clave para limpiar recursos y evitar fugas de memoria.

Método Principal:

componentWillUnmount()

Este método se ejecuta justo antes de que el componente sea destruido. Es el lugar adecuado para limpiar recursos, cancelar suscripciones o invalidar temporizadores. Es decir, imagina que estás limpiando tu habitación antes de mudarte. componentWillUnmount es el momento en que te aseguras de que no dejas nada atrás.

 
componentWillUnmount() {
  clearInterval(this.intervalo);
}

Uso de Hooks en Componentes Funcionales

Con la introducción de los Hooks en React 16.8, los componentes funcionales pueden manejar el ciclo de vida utilizando useEffect. Este Hook combina la funcionalidad de varios métodos del ciclo de vida en componentes de clase. Por ejemplo, usar useEffect es como tener un asistente que se encarga de todas las tareas relacionadas con el ciclo de vida, desde la preparación hasta la limpieza.

 
import React, { useState, useEffect } from 'react';

function MiComponenteFuncional() {
  const [contador, setContador] = useState(0);

  useEffect(() => {
    document.title = `Contador: ${contador}`;

    return () => {
      console.log('Cleanup al desmontar o actualizar');
    };
  }, [contador]);

  return (
    <div>
      <p>Contador: {contador}</p>
      <button onClick={() => setContador(contador + 1)}>Incrementar</button>
    </div>
  );
}

En este ejemplo, useEffect se ejecuta después de cada renderización y actualiza el título del documento con el valor actual del contador. Además, devuelve una función de limpieza que se invoca antes de la siguiente ejecución de useEffect o cuando el componente se desmonta.

Por ello, el ciclo de vida de los componentes en React es un concepto esencial para construir aplicaciones eficientes y mantener un código limpio. Mientras que los componentes de clase utilizan métodos específicos para cada fase del ciclo de vida, los componentes funcionales modernos aprovechan los Hooks, como useEffect, para manejar efectos secundarios y otras operaciones relacionadas con el ciclo de vida.

Code In Progress with ❤️ by Juan Pablo Amador