Skip to content

Instantly share code, notes, and snippets.

@cmorten
Last active April 20, 2025 22:10
Show Gist options
  • Select an option

  • Save cmorten/606f223bfa555339b5b4ccf865678263 to your computer and use it in GitHub Desktop.

Select an option

Save cmorten/606f223bfa555339b5b4ccf865678263 to your computer and use it in GitHub Desktop.
React Hydrate On View
import React, { useEffect, useRef, useState } from 'react';
export function HydrateOnView({ children }: { children: React.ReactNode }) {
const ref = useRef<HTMLElement>(null);
const [inView, setInView] = useState(false);
useEffect(() => {
if (!ref.current || inView) return;
const observer = new IntersectionObserver(([entry]) => {
if (entry.isIntersecting) {
observer.disconnect();
startTransition(() => {
setInView(true);
});
}
});
observer.observe(ref.current);
return () => observer.disconnect();
}, [hydrated]);
// On the server, always render children
if (typeof window === 'undefined') {
return <div>{children}</div>;
}
return (
<div
ref={ref}
suppressHydrationWarning
dangerouslySetInnerHTML={!inView ? { __html: '' } : undefined}
>
{inView ? children : null}
</div>
);
}
import React, { useEffect, useRef, useState, Suspense } from "react";
export function HydrateOnView({ children }: { children: React.ReactNode }) {
const ref = useRef<HTMLElement>(null);
const [inView, setInView] = useState(false);
useEffect(() => {
if (!ref.current || inView) return;
const observer = new IntersectionObserver(([entry]) => {
if (entry.isIntersecting) {
observer.disconnect();
startTransition(() => {
setInView(true);
});
}
});
observer.observe(ref.current);
return () => observer.disconnect();
}, [inView]);
return (
<div ref={ref}>
<Suspense fallback={null}>
<MaybeSuspend suspend={!inView}>{children}</MaybeSuspend>
</Suspense>
</div>
);
}
function MaybeSuspend({
suspend,
children,
}: {
suspend: boolean;
children: React.ReactNode;
}) {
if (suspend) {
throw new Promise(() => {});
}
return <>{children}</>;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment