React Hooks
El Hook useLayoutEffect
useLayoutEffect Hook ### ### Introducción ### El Hook useLayoutEffect
es similar a useEffect
, pero se diferencia en cuándo se ejecuta. Mientras que useEffect
se ejecuta después de que el DOM se haya actualizado, useLayoutEffect
se ejecuta de forma sincrónica después de que React ha realizado todas las actualizaciones del DOM, pero antes de que el navegador haga una pintura en la pantalla. Esto lo hace particularmente útil para leer el DOM y hacer cálculos antes de que el navegador pinte la pantalla. ### Sintaxis básica ### useLayoutEffect
se utiliza de manera similar a useEffect
, con una función de efecto y opcionalmente una lista de dependencias. javascript import React, { useState, useLayoutEffect, useRef } from 'react'; function LayoutEffectExample() { const [height, setHeight] = useState(0); const divRef = useRef(null); useLayoutEffect(() => { if (divRef.current) { setHeight(divRef.current.getBoundingClientRect().height); } }, []); return ( <div> <div ref={divRef}>Calcula mi altura</div> <p>La altura del div es: {height}px</p> </div> ); }
### Descripción del ejemplo ### En este ejemplo: - divRef
es una referencia creada con useRef
que se asigna al elemento div
. - useLayoutEffect
se utiliza para calcular la altura del div
después de que se haya actualizado en el DOM, pero antes de que el navegador pinte la pantalla. ### Casos de uso ### useLayoutEffect
es particularmente útil para: - Lectura y manipulación del DOM: Situaciones donde necesitas realizar mediciones del DOM y aplicar cambios antes de la pintura. - Sincronización con otros efectos del DOM: Caso en el que los cambios deben ser reflejados antes de que el navegador pinte. ### Comparación con useEffect ### La principal diferencia entre useLayoutEffect
y useEffect
es el momento en que se ejecutan: - useEffect: Se ejecuta después de que el navegador haya pintado la pantalla. Ideal para efectos no críticos (fetch de datos, suscripciones). - useLayoutEffect: Se ejecuta antes de que el navegador pinte, después de todas las modificaciones en el DOM. Perfecto para lecturas y escrituras sincronizadas en el DOM que necesitan ser realizadas juntas. ### Ejemplo avanzado ### Considera un caso en el que necesitas calcular y ajustar elementos visuales antes de que se rendericen completamente. javascript import React, { useState, useLayoutEffect, useRef } from 'react'; function ScrollBox() { const [scrollWidth, setScrollWidth] = useState(0); const boxRef = useRef(null); useLayoutEffect(() => { if (boxRef.current) { setScrollWidth(boxRef.current.scrollWidth); } }, []); return ( <div> <div ref={boxRef} style={{ overflowX: 'scroll', whiteSpace: 'nowrap' }}> <span style={{ display: 'inline-block', width: '200%' }}>Contenido largo</span> </div> <p>El ancho de contenido es: {scrollWidth}px</p> </div> ); }
### Descripción del ejemplo avanzado ### En este ejemplo: - boxRef
es una referencia al div
que contiene un contenido desplazable horizontalmente. - useLayoutEffect
mide el scrollWidth
del div
y actualiza el estado scrollWidth
antes de que el navegador pinte la pantalla. ### Advertencias ### Aunque useLayoutEffect
es poderoso, debe usarse con precaución. Fue creado para casos donde se necesitan leer y escribir en el DOM antes de la pintura del navegador, pero puede ralentizar la experiencia del usuario si se usa incorrectamente. ### Consideraciones de rendimiento ### Dado que useLayoutEffect
se ejecuta sincrónicamente, puede bloquear la pintura del navegador si los cálculos son pesados. Utilízalo solo cuando sea absolutamente necesario y procura optimizar la lógica dentro del efecto. [Placeholder para imagen sobre el uso de useLayoutEffect: Diagrama que muestra cómo useLayoutEffect
se ejecuta antes de la pintura del navegador, destacando su diferencia con useEffect
] .
Pregúntame lo que sea