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
useEffectEnquanto 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.