Обнаружение динамического n-го div с помощью IntersectionObserver API

#javascript #reactjs #intersection-observer

#javascript #reactjs #пересечение-наблюдатель

Вопрос:

У меня есть бесконечная прокрутка с React.js

Это буквально бесконечно, поэтому я не могу измерить, сколько это.

 <div className="InfiniteScroll">
  <div ref={observer} className="item">item</div>
  <div ref={observer2} className="item">item</div>
  {/* Actually I am using map() */}
  {...}
</div>
  

Я могу добавить IntersectionObserver на любой div .

 const observer = new IntersectionObserver(() => { 
  console.log('Found it');
},{
  root: divRef.current,
  rootMargin: ...,
});
  

Когда я хочу узнать видимые в данный момент разделы, как я могу узнать это с помощью этого?

Добавление IntersectionObserver к каждому div выглядит неразумно.

Если я хочу вызвать какую-либо функцию с 1000-м div или случайным div, как я могу этого добиться?

Комментарии:

1. используете ли вы карту для отображения данных?

2. @RamyRagab Да, я использую map() для массива.

Ответ №1:

вы можете установить любой div с помощью кода

 new IntersectionObserver(function(div) {
    div.isIntersecting amp;amp; do_something();
}).observe(div);
  

Комментарии:

1. Как я могу получить доступ к 1001-му div?

2. ReactDOM.render(элемент, контейнер [, обратный вызов]); можете ли вы установить IntersectionObserver внутри обратного вызова?

Ответ №2:

Я бы посоветовал вам прикрепить ссылку к самому последнему div. Итак, когда этот последний div пересекается, вы можете вызвать свою функцию там.

Прикрепление ссылки к последнему div

 {list.map((item, index) => {
    if (item.length === index   1) {
      return <div ref={lastItemElementRef} key={item}>{item}</div>
    } else {
      return <div key={item}>{item}</div>
    }
})}
  

Теперь, когда вы достигнете этого последнего div, вы можете вызвать внешний API для бесконечной прокрутки и вызвать некоторую функцию

Пересекающаяся логика

   const observer = useRef()
  const lastItemElementRef = useCallback(node => {
    if (loading) return
    if (observer.current) observer.current.disconnect()
    observer.current = new IntersectionObserver(entries => {
      if (entries[0].isIntersecting) {
        // logic for triggering set state and API call - Infinite scroll
        // some other function invokation
      }
    })
    if (node) observer.current.observe(node)
  }, [loading, otherdependencies])
  

Комментарии:

1. Я уже использую первый div и последний div с. IntersectionObserver но я борюсь с nth div. Когда я обнаружил 412th div, я хотел бы вызвать некоторую функцию. Число может быть динамическим.