组件维护 IntersectionObserver 实例
const ioRef = useRef(
new IntersectionObserver((entries: Array<IntersectionObserverEntry>) => {
entries.forEach((i: IntersectionObserverEntry) => {
const { target, isIntersecting } = i;
if (isIntersecting) {
target.setAttribute('src', target.getAttribute('data-src'));
ioRef.current.unobserve(target);
}
});
}),
);
渲染阶段收集dom实例
let imgs = []
<img
data-src={src}
alt="img"
ref={(dom: HTMLImageElement | null) => {
if (dom) imgs.push(dom)
}}
/>
生命周期中监听dom实例
useEffect(() => {
imgs.forEach((i: HTMLImageElement) => ioRef.current.observe(i))
}, [])
销毁时候应该断开 IntersectionObserver 连接
useEffect(() => () => ioRef.current.disconnect(), [])