useIntersectionObserver
Tracks intersection state for an element.
Usage
import { useIntersectionObserver } from "@siberiacancode/reactuse";
const observer = useIntersectionObserver<HTMLDivElement>();
// or
const observer = useIntersectionObserver(ref, { threshold: 0.5 });Example
import { useIntersectionObserver } from "@siberiacancode/reactuse";
export const LazyItem = () => {
const observer = useIntersectionObserver<HTMLDivElement>({ threshold: 0.5 });
const isVisible = observer.entries?.[0]?.isIntersecting ?? false;
return <div ref={observer.ref}>{isVisible ? "Visible" : "Hidden"}</div>;
};enabled:
Toggle observer.
const observer = useIntersectionObserver<HTMLDivElement>({ enabled: false });onChange:
Observer callback.
const observer = useIntersectionObserver<HTMLDivElement>({
onChange: (entries) => console.log(entries),
});root:
Scroll container.
const observer = useIntersectionObserver<HTMLDivElement>({
root: containerRef,
});rootMargin:
Root offset.
const observer = useIntersectionObserver<HTMLDivElement>({
rootMargin: "10px",
});threshold:
Intersection ratio.
const observer = useIntersectionObserver<HTMLDivElement>({ threshold: 0.5 });Notes
- Hook uses the IntersectionObserver API.
Type Declarations
import type { HookTarget } from "@siberiacancode/reactuse";
import type { StateRef } from "@siberiacancode/reactuse";
export type UseIntersectionObserverCallback = (
entries: IntersectionObserverEntry[],
observer: IntersectionObserver
) => void;
export interface UseIntersectionObserverOptions
extends Omit<IntersectionObserverInit, "root"> {
enabled?: boolean;
onChange?: UseIntersectionObserverCallback;
root?: HookTarget;
}
export interface UseIntersectionObserverReturn {
entries?: IntersectionObserverEntry[];
observer?: IntersectionObserver;
}
export interface UseIntersectionObserver {
<Target extends Element>(
options?: UseIntersectionObserverOptions,
target?: never
): UseIntersectionObserverReturn & { ref: StateRef<Target> };
(
target: HookTarget,
options?: UseIntersectionObserverOptions
): UseIntersectionObserverReturn;
<Target extends Element>(
callback: UseIntersectionObserverCallback,
target?: never
): UseIntersectionObserverReturn & { ref: StateRef<Target> };
(
target: HookTarget,
callback: UseIntersectionObserverCallback
): UseIntersectionObserverReturn;
}
export declare const useIntersectionObserver: UseIntersectionObserver;