Skip to content

Instantly share code, notes, and snippets.

@jsamr
Created May 17, 2022 15:43
Show Gist options
  • Save jsamr/a06fb9bc095a60f3ac4b001ab86e2e0c to your computer and use it in GitHub Desktop.
Save jsamr/a06fb9bc095a60f3ac4b001ab86e2e0c to your computer and use it in GitHub Desktop.
function useDelayedRendering<T>({
element,
delay = 200,
}: {
element: T;
delay: number;
}) {
const [renderedEl, setRenderedEl] = useState(element);
const lastRenderedAt = useRef(Date.now());
useEffect(
function delayRendering() {
const nextRenderAt = delay - (Date.now() - lastRenderedAt.current);
function updateElement() {
setRenderedEl(element);
lastRenderedAt.current = Date.now();
}
if (renderedEl !== element && nextRenderAt <= 0) {
updateElement();
} else {
// postpone rendering
const timeout = setTimeout(updateElement, nextRenderAt);
return () => clearTimeout(timeout);
}
},
[delay, element, renderedEl]
);
return renderedEl;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment