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

#javascript #reactjs

Вопрос:

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

 
const ItemMarkup = forwardRef(({user}, ref) => <li ref={ref}>...</li>)

// This opens up in a modal: https://headlessui.dev/react/dialog
<div className="content">
  {/** Tailwind's fixed height 'h-96' */}
  <ul ref={scrollRef} className="h-96 overflow-scroll">
    {users.map((user, index) => 
      <ItemMarkup
        {/** I'm looking for the last item/element to come in this view (ul) */}
        ref={users.length === index   1 ? ref : null}
        key={user.id} 
        user={user} 
      />
    )}
  </ul>
</div>

 

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

 // element would be the ref.current
// target would be scrollRef
// But this always return false
function isInViewport(element, target) {
  const rect = element.getBoundingClientRect();
  return (
      rect.top >= 0 amp;amp;
      rect.left >= 0 amp;amp;
      rect.bottom <= target.innerHeight amp;amp;
      rect.right <= target.innerWidth
  );
}

 

Вот как я попробовал эту попытку:

 const ref = useRef()
const scrollRef = useRef()

// From the demo link above
const onScreen = useOnScreen(ref)

// No idea if I need this
const [scrolling, setScrolling] = useState(false)

useEffect(() => {
  const onScroll = e => {
    setScrolling(true)
    console.log(isInViewport(ref.current, scrollRef))
  };
  scrollRef?.current.addEventListener("scroll", onScroll);
  //console.log(ref, onScreen)

  return () => scrollRef?.current.removeEventListener("scroll", onScroll);
}, [ref, onScreen, scrolling])

 

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

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

Ответ №1:

Я думаю, что у меня слишком сложные вещи:

 
useEffect(() => {
  const onScroll = e => {
    console.log(isInViewport(e.target))
  };
  scrollRef?.current.addEventListener("scroll", onScroll);

  return () => scrollRef?.current.removeEventListener("scroll", onScroll);
}, [])


function isInViewport(element) {
  return element.scrollHeight - element.scrollTop === element.clientHeight
}
 

Теперь, когда я прокручиваю страницу вниз, я вижу журнал консоли true .