React Hook - useLayoutEffect
O useLayoutEffect
é um dos React Hooks que proporciona controle mais detalhado sobre a manipulação do layout antes da renderização final do DOM. Ele é semelhante ao useEffect, mas é sincronizado com o ciclo de vida de atualização do DOM, ocorrendo após todas as mutações no DOM, mas antes da pintura na tela.
Diferença em relação ao
useEffect
Enquanto o
useEffect
é mais adequado para operações assíncronas que não bloqueiam a pintura na tela, ouseLayoutEffect
é útil quando é necessário garantir que as mudanças no layout sejam aplicadas de forma síncrona antes da pintura, mesmo que isso possa causar algum impacto no desempenho.
Sintaxe
useLayoutEffect(() => {
// Lógica síncrona para manipulação do layout
// ...
}, [dependencias]);
Assim como o useEffect
, o useLayoutEffect
recebe uma função de retorno e uma lista de dependências. No entanto, a principal diferença é que o código dentro de useLayoutEffect
é executado de forma síncrona após as mudanças no DOM.
Caso de uso
import { useLayoutEffect, useRef, useState } from 'react';
export const Home = () => {
const [counted, setCounted] = useState([0, 1, 2, 3, 4]);
const divRef = useRef();
useLayoutEffect(() => {
const simulateTimeConsumingOperation = () => {
const startTime = Date.now();
while (Date.now() < startTime + 1500);
};
simulateTimeConsumingOperation();
divRef.current.scrollTop = divRef.current.scrollHeight;
});
const handleClick = () => {
setCounted((c) => [...c, Number(c.slice(-1)) + 1]);
};
return (
<>
<button onClick={handleClick}>Count {counted.slice(-1)}</button>
<div ref={divRef} style={{ height: '100px', width: '100px', overflowY: 'scroll' }}>
{counted.map((c) => {
return <p key={`c-${c}`}>{c}</p>;
})}
</div>
</>
);
};
Neste exemplo, o useLayoutEffect
é empregado para controlar de maneira síncrona a manipulação do layout, permitindo a atualização imediata de um elemento de rolagem. A simulação de uma operação demorada destaca a capacidade do useLayoutEffect
de garantir que as mudanças no layout sejam aplicadas antes da renderização final no DOM.
Quanto usar
useLayoutEffect
?
- Medições do layout: Quando você precisa realizar medições no layout do DOM, como obter as dimensões de um elemento após ele ser renderizado.
- Manipulação síncrona do layout: Em situações em que é crucial realizar manipulações no layout de forma síncrona, evitando flashes ou cálculos incorretos de layout.
O useLayoutEffect
é uma ferramenta poderosa quando é necessário lidar com manipulações de layout de forma síncrona. No entanto, deve ser utilizado com cuidado, pois operações demoradas podem impactar o desempenho da aplicação. Geralmente, o useEffect
é suficiente para a maioria dos casos, e o useLayoutEffect
é reservado para situações específicas que exigem sincronia estrita com o layout do DOM.