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

Например:

App.jsx

import { useState } from 'react';

export default function App() {
  const [scrollTop, setScrollTop] = useState(0);

  const handleScroll = (event) => {
    setScrollTop(event.currentTarget.scrollTop);
  };

  return (
    <div>
      Scroll top: <b>{scrollTop}</b>
      <br />
      <br />
      <div
        style={{
          border: '1px solid black',
          width: '400px',
          height: '200px',
          overflow: 'auto',
        }}
        onScroll={handleScroll}
      >
        {[...Array(10)].map((_, i) => (
          <p key={i}>Content</p>
        ))}
      </div>
    </div>
  );
}

Функция (прослушиватель событий), переданная реквизиту onScroll, вызывается всякий раз, когда окно просмотра прокручивается. Он вызывается с объектом события, который можно использовать для выполнения действий и доступа к информации, связанной с событием прокрутки.

Свойство currentTarget этого объекта события возвращает элемент, к которому был присоединен прослушиватель onScroll.

Совет. Если вы не знаете, когда использовать свойства currentTarget или target объекта события, вам может помочь эта статья: Event target vs currentTarget in JavaScript: The Important Difference.

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

Примечание. Мы использовали хук useState для управления состоянием. Этот хук возвращает массив из двух значений, где первое — это переменная, хранящая состояние, а второе — функция, которая обновляет состояние при ее вызове.

Обработка события onScroll для объекта window в React

Мы также можем обработать событие onScroll для глобального объекта window, чтобы выполнить действие при прокрутке области просмотра. Мы можем сделать это с помощью метода addEventListener():

App.js

import { useState, useEffect } from 'react';

export default function App() {
  const [scrollTop, setScrollTop] = useState(0);

  useEffect(() => {
    const handleScroll = (event) => {
      setScrollTop(window.scrollY);
    };

    window.addEventListener('scroll', handleScroll);

    return () => {
      window.removeEventListener('scroll', handleScroll);
    };
  }, []);

  return (
    <div>
      <div
        style={{
          position: 'fixed',
          padding: '10px 0',
          top: '0',
          backgroundColor: 'white',
          borderBottom: '1px solid #c0c0c0',
          width: '100%',
        }}
      >
        Scroll top: <b>{scrollTop}</b>
      </div>
      <div style={{ marginTop: '50px' }}>
        {[...Array(30)].map((_, i) => (
          <p key={i}>Content</p>
        ))}
      </div>
    </div>
  );
}

Метод addEventListener() принимает до двух аргументов:

  1. type: строка, представляющая тип события для прослушивания.
  2. listener: функция, вызываемая при возникновении события.

Он также принимает некоторые необязательные аргументы, о которых вы можете узнать подробнее здесь.

Мы вызываем addEventListener() в хуке useEffect, чтобы зарегистрировать прослушиватель, как только компонент отобразится при загрузке страницы. Мы передаем пустой массив зависимостей в useEffect, поэтому эта регистрация происходит только один раз. В функции очистки мы вызываем метод removeEventListener(), чтобы отменить регистрацию прослушивателя событий и предотвратить утечку памяти.

В слушателе onScroll мы обращаемся к свойству Window scrollY, чтобы отобразить количество пикселей, на которые страница в данный момент прокручивается по горизонтали.

Первоначально опубликовано на codingbeautydev.com

Все сумасшедшие вещи, которые делает JavaScript

Увлекательное руководство по тонким предостережениям и менее известным частям JavaScript.

Зарегистрируйтесь и немедленно получите бесплатную копию.

Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube,и Discord. Заинтересованы в Взлом роста? Ознакомьтесь с разделом Схема.