Saltar al contenido principal

Ciclo de vida

En React, cada componente pasa por diferentes fases durante su vida.

Life Cycle

La fase de Mounting significa que el componente está en proceso de insertar su contenido en el DOM.

Updating se llama cuando el componente está siendo actualizado. La actualización de un componente se produce cuando hay un cambio en el estado del componente o de sus propiedades.

La última fase Unmounting se llama cuando un componente tiene que ser eliminado del DOM.

Con useEffect es posible realizar efectos secundarios (side effects) en los componentes, recibe una función como primer parámetro, que es ejecutada cada vez que un componente es renderizado, el segundo parámetro es opcional, es un array de dependencias que en caso de ser actualizadas provocan la ejecución de la función.

Los efectos secundarios son todas las operaciones que afectan al componente y que no pueden realizarse durante el renderizado, la obtención de datos, las suscripciones o el cambio manual del DOM son ejemplos de efectos secundarios.


Life Cycle Hooks


useEffect ejecutará la función en la fase de update, después de que el componente haya sido montado en el navegador, cuando se cumple una de las condiciones:

  • Por un cambio de estado (useState) propio o de un ancestro.
  • Por recibir propiedades nuevas.
  • La primera vez que el componente se monta.
tip
  • Al añadir el efecto, la función es ejecutada cada vez que el componente se renderiza.
  • useEffect no es el ciclo de vida, se suele confundir debido a como funciona en componentes de clase.
  • useEffect existe para sincronizar el estado del mundo con el estado del componente.

warning

React remonta intencionalmente los componentes en desarrollo para ayudar a encontrar errores. La pregunta correcta no es "cómo ejecutar un efecto una vez", sino "cómo arreglar el efecto para que funcione después de volver a montarlo. Por lo general, la respuesta es implementar la función de limpieza.


import { useEffect } from 'react';

const Component = () => {
useEffect(() => {
console.log('mounting & updating')
});
}

export default Component;

useEffect retorna una función que es ejecutada cuando el componente es renderizado o se desmonta.

import { useEffect } from 'react';

const Component = () => {
useEffect(() => {
console.log('mounting & updating')
return () => console.log('unmounting');
});
}

export default Component;

Cada vez que el componente se renderiza se van acumulando nuevos intervalos.



La función de retorno de useEffect limpia el intervalo de manera que cada vez que el componente se renderiza lo detiene.


tip

La función ejecutada cuando el componente se desmonta, permite evitar comportamientos activos después de eliminar el componente del DOM.


tip

Es probable que el uso de efectos no sea necesario, los efectos se utilizan normalmente para "salir" del código React y sincronizar con algún sistema externo.


Para evitar que useEffect ejecute la función una vez el componente ha sido renderizado, se añade un array vacío como segundo parámetro de la función useEffect. Este uso del useEffect se suele relacionar con la carga de datos al renderizar componentes, en este caso, se modifica el hook que se encarga de los datos para cargar el listado de países de forma remota.

8.4-rendering/src/hooks/useCountries.jsx
loading...


useEffect no ejecutará la función en los siguientes renderizados si no tiene un listado de dependencias a observar.


useEffect ejecutará la función la primera vez que el componente se renderice y posteriormente cuando las dependencias se actualicen.

8.5-rendering/src/hooks/useCountries.jsx
loading...


tip

Al utilizar useEffect se pueden realizar cambios en el estado del componente, al realizar el cambio en el estado provoca que useEffect ejecute la función de nuevo, es decir, un bucle.



tip

Para realizar peticiones a sistemas externos es recomendable utilizar librerías como React Query, useSWR que ofrecen mecanismos para optimizar las llamadas, que de lo contrario se deberían implementarse manualmente.

tip

useEffect es asíncrono, para utilizarlo de manera síncrona antes de que el componente sea montado, React dispone del hook useLayoutEffect.