Estado y ciclo de vida de los componentes

Intermedio
React
React
Actualizado: 22/05/2025

¡Desbloquea el curso completo!

IA
Ejercicios
Certificado
Entrar

¿Qué es el ciclo de vida en componentes de React?

El ciclo de vida de un componente en React se refiere a las fases por las que pasa un componente desde que se monta en el DOM hasta que se desmonta. Entender estas fases es crucial para manejar correctamente el estado y los efectos secundarios en tus aplicaciones.

Existen tres fases principales en el ciclo de vida de un componente:

Montaje: Esta fase incluye la creación del componente y su inserción en el DOM. En componentes de clase, los métodos constructor(), static getDerivedStateFromProps(), render(), y componentDidMount() son invocados en esta fase. En componentes funcionales, se utilizan los hooks useState y useEffect para manejar lógica de estado y efectos secundarios.

Actualización: Esta fase ocurre cuando las props o el estado de un componente cambian. En componentes de clase, los métodos static getDerivedStateFromProps(), shouldComponentUpdate(), render(), getSnapshotBeforeUpdate(), y componentDidUpdate() son invocados. En componentes funcionales, el hook useEffect puede ser utilizado para manejar actualizaciones basadas en dependencias.

Desmontaje: Esta fase se activa cuando el componente se elimina del DOM. En componentes de clase, el método componentWillUnmount() es invocado. En componentes funcionales, se puede retornar una función de limpieza desde el hook useEffect.

Un ejemplo práctico de cómo manejar estos ciclos de vida en un componente funcional es el siguiente:

// MiComponente.jsx
import { useState, useEffect } from 'react';

export default function MiComponente() {
  const [contador, setContador] = useState(0);

  // Efecto que se ejecuta al montar y actualizar
  useEffect(() => {
    console.log('Componente montado o actualizado');
    
    // Función de limpieza que se ejecuta al desmontar
    return () => {
      console.log('Componente desmontado');
    };
  }, [contador]); // Dependencia: contador

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

En este ejemplo, useEffect se utiliza para manejar efectos secundarios. El primer argumento es una función que se ejecuta después de cada renderizado, y el segundo argumento es un array de dependencias que determina cuándo debe ejecutarse el efecto. Si alguna dependencia cambia, el efecto se ejecutará de nuevo. La función de limpieza dentro del useEffect se ejecuta cuando el componente se desmonta.

Ciclo de vida en componentes de clase

Guarda tu progreso

Inicia sesión para no perder tu progreso y accede a miles de tutoriales, ejercicios prácticos y nuestro asistente de IA.

Progreso guardado
Asistente IA
Ejercicios
Iniciar sesión gratis

Más de 25.000 desarrolladores ya confían en CertiDevs

En React, los componentes de clase tienen métodos específicos que se invocan en diferentes etapas del ciclo de vida del componente. Estos métodos permiten ejecutar código en respuesta a cambios en el estado o las props del componente, proporcionando un control detallado sobre su comportamiento.

Fase de montaje

La fase de montaje es cuando un componente se crea y se inserta en el DOM. Los métodos principales involucrados en esta fase son:

  • constructor(props): Se invoca antes de que el componente se monte. Es el lugar ideal para inicializar el estado y enlazar métodos.
  • static getDerivedStateFromProps(nextProps, prevState): Es un método estático que se llama justo antes de renderizar el componente, tanto en el montaje como en la actualización. Permite actualizar el estado en respuesta a cambios en las props.
  • render(): El único método obligatorio en un componente de clase. Devuelve el árbol de elementos React que se debe renderizar.
  • componentDidMount(): Se invoca inmediatamente después de que el componente se haya montado en el DOM. Es un buen lugar para realizar solicitudes HTTP o suscripciones.

Ejemplo de un componente de clase en la fase de montaje:

// MiComponenteDeClase.jsx
import { Component } from 'react';

export default class MiComponenteDeClase extends Component {
  constructor(props) {
    super(props);
    this.state = {
      contador: 0
    };
  }

  componentDidMount() {
    console.log('Componente montado');
  }

  render() {
    return (
      <div>
        <p>Contador: {this.state.contador}</p>
      </div>
    );
  }
}

Fase de actualización

La fase de actualización ocurre cuando las props o el estado de un componente cambian. Los métodos principales involucrados en esta fase son:

  • static getDerivedStateFromProps(nextProps, prevState): Permite actualizar el estado en respuesta a cambios en las props.
  • shouldComponentUpdate(nextProps, nextState): Determina si el componente debe renderizarse de nuevo. Por defecto, devuelve true.
  • render(): Devuelve el árbol de elementos React que se debe renderizar.
  • getSnapshotBeforeUpdate(prevProps, prevState): Se invoca justo antes de que los cambios del DOM se apliquen. Permite capturar información del DOM antes de la actualización.
  • componentDidUpdate(prevProps, prevState, snapshot): Se invoca inmediatamente después de que la actualización ocurra. Es un buen lugar para realizar operaciones de DOM adicionales o para ejecutar solicitudes HTTP en respuesta a cambios en las props o el estado.

Ejemplo de un componente de clase en la fase de actualización:

// MiComponenteDeClase.jsx
import { Component } from 'react';

export default class MiComponenteDeClase extends Component {
  constructor(props) {
    super(props);
    this.state = {
      contador: 0
    };
  }

  componentDidMount() {
    console.log('Componente montado');
  }

  shouldComponentUpdate(nextProps, nextState) {
    // Condición para permitir la actualización
    return nextState.contador !== this.state.contador;
  }

  componentDidUpdate(prevProps, prevState) {
    console.log('Componente actualizado');
  }

  incrementarContador = () => {
    this.setState({ contador: this.state.contador + 1 });
  };

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

Fase de desmontaje

La fase de desmontaje es cuando un componente se elimina del DOM. El método principal involucrado en esta fase es:

  • componentWillUnmount(): Se invoca inmediatamente antes de que el componente se desmonte y destruya. Es el lugar adecuado para realizar tareas de limpieza como cancelar solicitudes HTTP, desuscribirse de eventos o liberar recursos.

Ejemplo de un componente de clase en la fase de desmontaje:

// MiComponenteDeClase.jsx
import { Component } from 'react';

export default class MiComponenteDeClase extends Component {
  constructor(props) {
    super(props);
    this.state = {
      contador: 0
    };
  }

  componentDidMount() {
    console.log('Componente montado');
  }

  componentWillUnmount() {
    console.log('Componente desmontado');
  }

  incrementarContador = () => {
    this.setState({ contador: this.state.contador + 1 });
  };

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

Estos métodos de ciclo de vida proporcionan un control detallado sobre el comportamiento de los componentes de clase en React, permitiendo manejar de manera efectiva el estado y los efectos secundarios en cada fase del ciclo de vida del componente.

Ciclo de vida en componentes funcionales

En React 16.8, los componentes funcionales han reemplazado en gran medida a los componentes de clase gracias a los hooks, que permiten manejar de manera eficiente el estado y los efectos secundarios. A través de hooks como useEffect, useState y otros, es posible controlar las diferentes fases del ciclo de vida de un componente funcional.

useEffect es el hook principal para manejar efectos secundarios en componentes funcionales. Puede ser utilizado para emular los métodos de ciclo de vida en componentes de clase como componentDidMount, componentDidUpdate y componentWillUnmount.

Montaje: Para manejar la fase de montaje en un componente funcional, se utiliza useEffect sin dependencias o con un array de dependencias vacío. Esto asegura que el efecto solo se ejecute una vez, después del primer renderizado.

// MiComponente.jsx
import { useEffect } from 'react';

export default function MiComponente() {
  useEffect(() => {
    console.log('Componente montado');
  }, []); // Array de dependencias vacío

  return (
    <div>
      <p>Componente funcional montado</p>
    </div>
  );
}

Actualización: useEffect también se utiliza para manejar las actualizaciones del componente. Para ello, se pasa un array de dependencias que especifica cuándo debe ejecutarse el efecto. Si alguna de las dependencias cambia, el efecto se ejecuta nuevamente.

// MiComponente.jsx
import { useState, useEffect } from 'react';

export default function MiComponente() {
  const [contador, setContador] = useState(0);

  useEffect(() => {
    console.log('Contador actualizado:', contador);
  }, [contador]); // Dependencia: contador

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

Desmontaje: Para manejar la fase de desmontaje, useEffect puede retornar una función de limpieza que se ejecutará cuando el componente se desmonte. Esto es útil para limpiar suscripciones, cancelar solicitudes HTTP o liberar recursos.

// MiComponente.jsx
import { useState, useEffect } from 'react';

export default function MiComponente() {
  const [contador, setContador] = useState(0);

  useEffect(() => {
    console.log('Componente montado o actualizado');

    return () => {
      console.log('Componente desmontado');
    };
  }, [contador]); // Dependencia: contador

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

Comportamiento condicional: useEffect permite manejar de manera condicional las fases del ciclo de vida del componente. Por ejemplo, si solo quieres ejecutar un efecto cuando una condición específica se cumpla, puedes hacerlo mediante el uso de dependencias y condiciones.

// MiComponente.jsx
import { useState, useEffect } from 'react';

export default function MiComponente() {
  const [contador, setContador] = useState(0);
  const [mensaje, setMensaje] = useState('');

  useEffect(() => {
    if (contador > 5) {
      setMensaje('El contador es mayor que 5');
    }
  }, [contador]); // Dependencia: contador

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

El uso de useEffect en componentes funcionales permite manejar de manera declarativa y eficiente las diferentes fases del ciclo de vida de los componentes en React. A través de este hook, puedes gestionar efectos secundarios y realizar tareas de limpieza, garantizando que tu aplicación se comporte de manera predecible y eficiente.

Aprendizajes de esta lección

  • Comprender las fases de montaje, actualización y desmontaje de un componente de React.
  • Aprender a manejar el ciclo de vida de los componentes con hooks (useEffect, useState) en componentes funcionales.
  • Dominar los métodos de ciclo de vida (constructor, componentDidMount, componentDidUpdate, componentWillUnmount) en componentes de clase.
  • Aplicar métodos de limpieza y suscriptores en el ciclo de vida de componentes.

Completa React y certifícate

Únete a nuestra plataforma y accede a miles de tutoriales, ejercicios prácticos, proyectos reales y nuestro asistente de IA personalizado para acelerar tu aprendizaje.

Asistente IA

Resuelve dudas al instante

Ejercicios

Practica con proyectos reales

Certificados

Valida tus conocimientos

Más de 25.000 desarrolladores ya se han certificado con CertiDevs

⭐⭐⭐⭐⭐
4.9/5 valoración