0Pricing
React Academy · Lección

Cuándo se ejecuta useLayoutEffect frente a useEffect

Aprender que useLayoutEffect se ejecuta sincrónicamente después de las mutaciones del DOM, pero antes de que el navegador pinte

Cuándo se ejecuta useLayoutEffect frente a useEffect es una lección gratuita de React Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de React Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de React Academy incluye 4 lecciones en total.

Temporización de useLayoutEffect

useLayoutEffect se ejecuta de forma síncrona inmediatamente después de que React haya aplicado las mutaciones del DOM, pero antes de que el navegador tenga la oportunidad de pintar esos cambios. Desde la perspectiva del navegador, el efecto de layout y las mutaciones del DOM forman parte del mismo bloque de trabajo síncrono e ininterrumpido.

Temporización de useEffect

useEffect se ejecuta de forma asíncrona después de que el navegador haya terminado de pintar. El usuario ve primero la interfaz actualizada y, a continuación, se ejecuta el efecto. Esto hace que useEffect interfiera menos con el rendimiento del renderizado, pero significa que cualquier cambio visible provocado por el efecto dará lugar a un segundo ciclo de pintado.

Experimento con marcas de tiempo

Puede verificar la diferencia de temporización registrando marcas de tiempo en ambos efectos: añada console.log('layout', Date.now()) en useLayoutEffect y console.log('passive', Date.now()) en useEffect. En la consola, la marca de tiempo del efecto de layout siempre será anterior a la del efecto pasivo, lo que confirma el orden de ejecución.

Consecuencias visibles para los usuarios

Si un useEffect actualiza un estado que afecta a la salida visual, el usuario ve dos renderizados: el renderizado inicial con el estado desactualizado y, después, el renderizado corregido cuando se ejecuta el efecto. Esto se manifiesta como un destello o un reajuste visible. useLayoutEffect lo evita porque sus actualizaciones de estado se aplican antes de que el navegador pinte nada.

La actualización de estado en useLayoutEffect provoca un nuevo renderizado síncrono

Si llama a setState dentro de un useLayoutEffect, React ejecuta inmediatamente otro ciclo de renderizado y commit antes de pintar. El navegador solo pinta el resultado final: el usuario nunca ve el estado intermedio. Este es el caso de uso principal de useLayoutEffect: medir el DOM, calcular un nuevo valor, actualizar el estado y garantizar un único pintado limpio.

Advertencia de rendimiento

Como useLayoutEffect se ejecuta de forma síncrona antes del pintado y puede desencadenar renderizados adicionales, su uso excesivo puede perjudicar el rendimiento. Si el trabajo síncrono es pesado, bloquea el pintado del navegador y provoca tirones visibles. Úselo únicamente cuando necesite evitar un destello visual; para todo lo demás, use useEffect.

Doble invocación de Strict Mode

En React Strict Mode (solo durante el desarrollo), tanto useLayoutEffect como useEffect se invocan dos veces por montaje. La secuencia es: montaje, limpieza y nuevo montaje. Esto ayuda a detectar efectos que no realizan correctamente la limpieza. La doble invocación no ocurre en las compilaciones de producción.

Regla de rendimiento: useEffect como opción predeterminada

La opción predeterminada siempre debe ser useEffect. Cambie a useLayoutEffect únicamente cuando pueda observar y reproducir un parpadeo visual o un problema de diseño incorrecto. El uso excesivo de useLayoutEffect bloquea innecesariamente la canalización de pintado del navegador y puede empeorar el rendimiento percibido.

Advertencia sobre SSR: useLayoutEffect en el servidor

useLayoutEffect no puede ejecutarse en el servidor porque en un entorno de servidor no hay DOM ni ciclo de pintado del navegador. Si se utiliza en un componente que se renderiza en el servidor, React emite una advertencia. La solución consiste en omitir condicionalmente el efecto: compruebe typeof window !== 'undefined' o cambie a useEffect para usar código compatible con SSR.

Cómo determinar cuál usar

Pregúntese: «¿Este efecto cambia algo que el usuario verá en el primer pintado?». Si la respuesta es afirmativa, use useLayoutEffect para evitar un destello. Si no —por ejemplo, para obtener datos, suscripciones, analíticas, registros y la mayoría de los demás efectos secundarios—, use useEffect. Este marco de decisión cubre la mayoría de los casos reales.

La naturaleza síncrona de useLayoutEffect

useLayoutEffect se ejecuta en el mismo bloque síncrono que las mutaciones del DOM. React no puede procesar otro trabajo (como responder a eventos del usuario) mientras se ejecuta un useLayoutEffect. Por eso debe ser rápido y centrarse en una tarea concreta. El código síncrono de larga duración en useLayoutEffect retrasa directamente que el navegador muestre el contenido en pantalla.

Temporización de useLayoutEffect

¿Cuándo se ejecuta exactamente useLayoutEffect con respecto a las mutaciones del DOM y al pintado del navegador?

Resumen de la lección: useLayoutEffect frente a useEffect

useLayoutEffect es síncrono y se ejecuta antes del pintado del navegador, por lo que resulta adecuado para medir el DOM y corregir aspectos visuales. useEffect se ejecuta después del pintado y es la opción adecuada para obtener datos, suscripciones y la mayoría de los efectos secundarios. Use useEffect como opción predeterminada y cambie a useLayoutEffect únicamente cuando un parpadeo visual confirme que es necesario. Evite usarlo en SSR sin las comprobaciones necesarias.

Preguntas frecuentes

¿La lección «Cuándo se ejecuta useLayoutEffect frente a useEffect» es gratis?

Sí — el texto completo de «Cuándo se ejecuta useLayoutEffect frente a useEffect» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de React Academy, actualiza a CoddyKit PRO. El curso de React Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Cuándo se ejecuta useLayoutEffect frente a useEffect»?

Aprender que useLayoutEffect se ejecuta sincrónicamente después de las mutaciones del DOM, pero antes de que el navegador pinte Practicas React Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar React Academy?

No se requiere experiencia previa. React Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «Cuándo se ejecuta useLayoutEffect frente a useEffect»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de React Academy?

Sí. Cada lección de React Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. La fase de renderizado y el commit del DOM
  2. Cuándo se ejecuta useLayoutEffect frente a useEffect
  3. Medir elementos del DOM con useLayoutEffect
  4. Evitar el exceso de recálculos de layout y el parpadeo visual
← Volver a React Academy