Intersection Observers — мощный инструмент современной веб-разработки. Они позволяют нам наблюдать, когда элемент входит или выходит из области просмотра пользователя, включая динамические эффекты, такие как отложенная загрузка, бесконечная прокрутка или запуск анимации.

В этом руководстве мы создадим собственный хук React под названием useIntersectionObserver, который инкапсулирует логику наблюдения за элементами для пересечения. Мы также приведем несколько примеров того, как этот хук можно использовать в реальных сценариях.

Шаг 1: Создание крючка

Начнем с создания нового файла с именем useIntersectionObserver.js. Внутри этого файла мы определим наш хук useIntersectionObserver:

import { useEffect, useState, useRef } from 'react';
function useIntersectionObserver(options) {
  const [target, setTarget] = useState(null);
  const [intersecting, setIntersecting] = useState(false);
  const observer = useRef(
    new window.IntersectionObserver(([entry]) => {
      setIntersecting(entry.isIntersecting);
    }, options)
  );
  useEffect(() => {
    const currentTarget = target;
    const currentObserver = observer.current;
    if (currentTarget) {
      currentObserver.observe(currentTarget);
    }
    return () => {
      if (currentTarget) {
        currentObserver.unobserve(currentTarget);
      }
    };
  }, [target]);
  return [setTarget, intersecting];
}
export default useIntersectionObserver;

Здесь мы используем хуки useEffect и useState для создания хука с отслеживанием состояния, который отслеживает элемент target и пересекается ли он в данный момент с окном просмотра. Мы также используем хук useRef для создания ссылки на экземпляр IntersectionObserver, который мы будем использовать для наблюдения за элементом target.

Шаг 2: Использование крючка

Теперь, когда мы определили наш хук, давайте используем его в простом примере. В этом примере мы будем использовать useIntersectionObserver, чтобы определить, когда изображение входит в область просмотра, и запустить его загрузку.

import React, { useState } from 'react';
import useIntersectionObserver from './useIntersectionObserver';

function LazyImage({ src, alt }) {
  const [loaded, setLoaded] = useState(false);
  const [ref, intersecting] = useIntersectionObserver({ threshold: 0.1 });

  if (intersecting && !loaded) {
    setLoaded(true);
  }

  return (
    <img
      ref={ref}
      src={loaded ? src : ''}
      alt={alt}
    />
  );
}

export default LazyImage;

Здесь мы определили новый компонент LazyImage, который принимает свойства src и alt. Внутри компонента мы используем наш хук useIntersectionObserver, чтобы определить, когда изображение входит в область просмотра. Как только изображение пересекается с областью просмотра, мы устанавливаем состояние loaded в true, что запускает загрузку изображения.

Заключение

Intersection Observers — это мощный инструмент современной веб-разработки, который позволяет использовать широкий спектр динамических эффектов. Создав собственный хук React для наблюдения за пересечением элементов, мы можем инкапсулировать логику и упростить ее повторное использование в различных компонентах и ​​контекстах.

В этом руководстве мы прошли этапы создания простого хука useIntersectionObserver и предоставили несколько примеров того, как его можно использовать в реальных сценариях. Мы также показали, как можно настроить хук для поддержки дополнительных опций и вариантов поведения.

Я надеюсь, что этот урок был вам полезен и вдохновил вас на эксперименты с Intersection Observers в ваших собственных проектах!