React Academy · Lección

Medir elementos del DOM con useLayoutEffect

Leer las dimensiones, posiciones y desplazamientos de elementos después del layout, pero antes del pintado, para evitar parpadeos

Lección 3 de 413 pasos

Medir elementos del DOM con useLayoutEffect es una lección gratuita de React Academy en CoddyKit. Esta es la lección 3 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.

Introducción a getBoundingClientRect

element.getBoundingClientRect() devuelve un objeto DOMRect con el tamaño y la posición del elemento con respecto a la ventana gráfica: top, right, bottom, left, width y height. Obliga al navegador a realizar un cálculo de layout para devolver valores precisos, por lo que debe llamarlo con moderación.

El problema de leer en useEffect

Si lee getBoundingClientRect() en un useEffect, el navegador ya habrá pintado. Si después actualiza el estado basándose en la medición, React vuelve a renderizar y el navegador pinta de nuevo. Es posible que los usuarios vean brevemente el elemento en una posición o con un tamaño incorrectos antes de que aparezca la corrección en el segundo pintado.

Por qué useLayoutEffect resuelve este problema

Leer las mediciones en useLayoutEffect ocurre después de las mutaciones del DOM, pero antes del pintado. Cualquier actualización de estado provocada por la medición hace que React vuelva a renderizar de forma síncrona y aplique el DOM corregido, todo ello antes de que el navegador haya pintado nada. El usuario solo ve el resultado final y correcto en un único ciclo de pintado.

Posicionamiento de información sobre herramientas

Una información sobre herramientas debe aparecer cerca del elemento que la activa. Mida la posición del elemento activador en useLayoutEffect mediante getBoundingClientRect(), calcule la posición absoluta de la información sobre herramientas y guarde esa posición en el estado. La información sobre herramientas se renderiza en la ubicación correcta desde el primer pintado, sin ningún salto visible desde una posición inicial incorrecta.

Animación de elementos: lectura del tamaño inicial

Para animar un elemento desde su tamaño natural (sin restricciones) hasta un tamaño fijo, necesita conocer el tamaño natural antes de aplicar la restricción. Lea la altura del elemento en useLayoutEffect antes de aplicar cualquier estilo de animación, guárdela en el estado y úsela después como valor del fotograma clave inicial de la transición CSS.

Altura de un encabezado fijo

Cuando una página tiene un encabezado fijo, el contenido del cuerpo necesita un relleno superior igual a la altura del encabezado para evitar quedar oculto detrás de él. Mida la altura del encabezado en useLayoutEffect mediante una ref: headerRef.current.getBoundingClientRect().height. Establezca este valor como paddingTop en el contenedor del contenido. El diseño será correcto desde el primer renderizado.

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

Cuando llama a setState dentro de useLayoutEffect, React ejecuta inmediatamente otro ciclo de renderizado y commit en el mismo bloque síncrono. Este nuevo renderizado también ejecuta su useLayoutEffect. Tenga cuidado de no crear un bucle infinito: actualice el estado únicamente si la nueva medición difiere del valor actual del estado.

SSR: las mediciones devuelven cero

En el servidor no existen elementos del DOM, por lo que getBoundingClientRect() produciría un error o devolvería ceros. Proteja su useLayoutEffect con una comprobación: if (typeof window === 'undefined') return;. En aplicaciones con SSR, puede que necesite hidratar con un tamaño provisional y realizar la medición después de la hidratación en el cliente.

ResizeObserver para el seguimiento continuo

Una medición única con useLayoutEffect le proporciona el tamaño en el momento del montaje. Para realizar un seguimiento de los cambios de tamaño a medida que el elemento cambia de tamaño (por un cambio en el tamaño de la ventana, contenido dinámico o cambios de CSS), use ResizeObserver. Este ejecuta una función de callback cada vez que cambia el tamaño del elemento, por lo que resulta más adecuado para componentes adaptables.

Cómo evitar mediciones redundantes

Si varios efectos necesitan la misma medición, calcúlela una vez y compártala mediante el contexto o pásela como prop. Calcular el mismo valor de getBoundingClientRect() en varias llamadas a useLayoutEffect provoca varias lecturas de layout síncronas, cada una de las cuales resulta relativamente costosa. Siempre que sea posible, consolide las mediciones.

Temporización de las refs con useLayoutEffect

Las refs se rellenan antes de que se ejecuten los efectos. Cuando se ejecuta useLayoutEffect, se garantiza que ref.current apunta al elemento del DOM. Por eso funciona este patrón: useLayoutEffect(() => { const rect = ref.current.getBoundingClientRect(); ... }, []). La ref nunca es null dentro de un efecto de layout en un componente montado.

Temporización de getBoundingClientRect

¿Por qué es mejor llamar a getBoundingClientRect() en useLayoutEffect que en useEffect?

Resumen de la lección: medición de elementos del DOM

Use getBoundingClientRect() en useLayoutEffect para leer las mediciones del DOM después de las mutaciones, pero antes del pintado. Las actualizaciones de estado derivadas de estas mediciones provocan un nuevo renderizado síncrono que se incluye en el mismo pintado y evita el parpadeo. Protéjase frente al SSR con una comprobación de typeof window. Para realizar un seguimiento continuo del tamaño, prefiera ResizeObserver.

Gratis para empezar

Aprende React con un tutor de IA — gratis

Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.

Cursos
88
Lecciones
324

Preguntas frecuentes

¿La lección «Medir elementos del DOM con useLayoutEffect» es gratis?

Sí — el texto completo de «Medir elementos del DOM con useLayoutEffect» 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 «Medir elementos del DOM con useLayoutEffect»?

Leer las dimensiones, posiciones y desplazamientos de elementos después del layout, pero antes del pintado, para evitar parpadeos 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 3 de 4.

¿Cuánto tiempo toma la lección «Medir elementos del DOM con useLayoutEffect»?

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